List <String> .Contains(mystring)是否进行引用比较或值比较?

Chr*_*ris 3 c# string

List.Contains(mystring)是否进行引用比较或值比较?我有这个代码:

/// <summary>
/// If the value isn't null or an empty string, 
/// and doesn't exist in the list, it adds it to the list
/// </summary>
static void AddToListIfNotEmpty(List<string> thelist, SqlString val)
{
  string value = val.ToString().Trim();
  if (!string.IsNullOrEmpty(value))
  {
    bool found = false;
    foreach (string x in thelist) if (x == value) found = true;
    if (!found) thelist.Add(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以简化foreach和以下行:

if (!thelist.Contains(value)) thelist.Add(value);
Run Code Online (Sandbox Code Playgroud)

谢谢

Avi*_*Dov 6

IList<T>用于Comparator<T>.Default进行比较,然后按String对象的值进行比较.

如果您愿意,可以将项目移动到IDictionary<T, bool>类似的东西,您可以在其中指定IComparator- 指定检查参考的项目.(即使在那种情况下,你最好使用foreach循环)

如果你可以使用LINQ,你也可以在那里创建一个带有引用比较的语句.


Gis*_*shu 5

来自MSDNList<T>.Contains

EqualityComparer<T>.Default此方法使用T(列表中值的类型)的默认相等比较器来确定相等性 。

... Default 属性检查类型 T 是否实现 IEquatable<T> 通用接口,如果是,则返回EqualityComparer<T> 使用该实现的类型。否则,它返回一个 使用和 提供的EqualityComparer<T>覆盖的。Object.EqualsObject.GetHashCodeT

看看反射器(并按照最小惊喜原则),字符串相等具有值类型语义 - 因此如果它们具有相同的字符串,则它们相等。两者Equals(Object)IEquatable.Equals(T)委托给String::EqualsHelper