C# 关于字符串。C语言实习生#

C# 关于字符串。C语言实习生#,c#,.net,winforms,string,C#,.net,Winforms,String,我需要在什么情况下调用string.Intern或string.IsInternedonstringvalue 网格使用此方法对行进行分组: // get grouping value for DataGrid string GroupItemAccessor(object value) { COA coa = (COA)value; return string.IsInterned(coa.GroupName); } 如果我不调

我需要在什么情况下调用
string.Intern
string.IsInterned
on
string
value

网格使用此方法对行进行分组:

    // get grouping value for DataGrid
    string GroupItemAccessor(object value)
    {
        COA coa = (COA)value;
        return string.IsInterned(coa.GroupName);
    }
如果我不调用
string.Intern
则结果是错误的,此网格应按
GroupName
的值分组

如果使用了
string.Intern
(类似于示例代码),它将按照我的预期工作


猜测一下,
超级列表
可能会对分组进行身份检查(引用检查)-如果确实是这样,则未插入的字符串将被视为不同的字符串,即使它们是相同的字符串


在这种情况下,需要将字符串插入,以便控件正确分组。

如果我猜的话,我会说网格使用引用相等。据我所知,只有文字字符串被插入


因此,如果不插入coa.GroupName,两个相等的组名就不是引用相等的,因此网格似乎对它们的处理不同。

得到不同结果的原因是,您不是根据字符串值分组,而是根据字符串引用分组。分组时,字符串不会被视为字符串,而是被视为对象,因此只比较引用,而不比较内容

从数据库读取值时,每个字符串都将是一个单独的实例,即使它们具有相同的值。例如,前两个字符串“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;
    }
  }

}
公共类本地互联网{
私人词典_intern=新词典();
公共字符串实习生(字符串值){
如果(_intern.ContainsKey(值)){
返回_intern[值];
}否则{
_实习增加(价值,价值);
返回值;
}
}
}

再次填充网格时,只需创建一个新的
LocalIntern
对象,就可以对上一个对象中保存的字符串进行垃圾收集。

如果只执行
返回coa.GroupName?您可以发布如何设置网格的分组吗?你用的是什么网格控件?这是webforms、winforms还是wpf?这是WinForm,我正在为网格使用SuperList。我们需要更多详细信息,特别是如何使用
GetItemAccessor
的结果。我怀疑它被传递给的对象是引用相等而不是值相等。感谢您的重播,我将检查
SuperList
源代码以确认这一点。感谢您的重播,我将检查
SuperList
代码以确认这一点。