2011-11-27 38 views
2

在什么情况下,我需要调用string.Internstring.IsInternedString价值?关于中的String.intern C#

我有这样的方法使用网格组行:

// get grouping value for DataGrid 
    string GroupItemAccessor(object value) 
    { 
     COA coa = (COA)value; 
     return string.IsInterned(coa.GroupName); 
    } 

如果我不叫string.Intern结果是错误的,这种电网应通过GroupName值组。

String.Intern not used

此如果string.Intern使用(如例如代码)它的工作作为我的预期。

String.Intern used

+0

如果你只是'返回coa.GroupName;'会发生什么? – Oded

+0

结果是图像#1。 –

+1

你可以发布你如何设置网格的分组吗?你用什么网格控制?这是webforms,winforms还是wpf? – Oded

回答

4

你得到不同的结果的原因是,你是不是上进行分组的字符串值,您是分组的字符串引用。字符串在分组时不被视为字符串,而是作为对象处理,因此仅比较引用,而不是内容。

当你从数据库中读取的值,每个字符串将是一个单独的实例,即使它们具有相同的价值。例如前两个字符串“AAA”将是单独的对象,而不是对同一对象的引用。

如果你不能在字符串值网格组,使用String.Intern是使琴弦相同情况下的一种方式,这样的分组作品反正。

但是,您可能需要使用自己的制作琴弦的相同情况的方法,因为实习的字符串意味着他们将永远不会被垃圾收集。您可以使用这样的类:

public class LocalIntern { 

    private Dictionary<string, string> _intern = new Dictionary<string, string>(); 

    public string Intern(string value) { 
    if (_intern.ContainsKey(value)) { 
     return _intern[value]; 
    } else { 
     _intern.Add(value, value); 
     return value; 
    } 
    } 

} 

当您再次填充网格,你只需要创建一个新的LocalIntern对象,并在此前举行的一个字符串可以被垃圾收集。

1

在猜测,SuperList大概会检查身份进行分组(参考检查) - 如果情况确实如此,那不拘留将被视为即使它们是相同的字符串不同的字符串。

在这种情况下,需要对字符串进行实验,以便控件正确分组。

+0

感谢您的回放,我会检查'SuperList'源代码来确认这一点。 –

1

如果我猜测那么我会说网格使用参考平等。据我所知,只有文字字符串被实施。

因此,没有实习coa.GroupName,这是平等的不相等的参考,因此两组名字不电网似乎区别对待。

+0

感谢您的回放,我会检查'SuperList'代码以确认这一点。 –