【问题标题】:Contains() method of List<T>List<T> 的 Contains() 方法
【发布时间】:2009-10-19 15:30:57
【问题描述】:

具体是哪个类中的方法负责List&lt;T&gt;Contains()操作?

我在课堂上重载了 ==。不过好像没什么效果。

【问题讨论】:

  • 这里有一些很好的答案。为什么不接受一个....
  • 我忘记接受了。

标签: c# contains generic-list


【解决方案1】:

它只会调用Equals() - 这就是所有需要被覆盖的东西(或者不,如果你对参考身份比较感到满意的话)。如果该类型实现了IEquatable&lt;T&gt;,那么该实现将优先于通用Equals(object)

特别是来自List&lt;T&gt;.Contains 的文档:

此方法使用以下方法确定相等性 默认相等比较器 EqualityComparer(T).DefaultT, 列表中值的类型。

来自EqualityComparer&lt;T&gt;.Default

Default 属性检查是否 类型 T 实现 System.IEquatable(T) 通用接口 如果是这样返回一个 EqualityComparer(T) 使用它 执行。否则返回 EqualityComparer(T) 使用 覆盖Object.EqualsObject.GetHashCodeT提供。

我不相信它会使用GetHashCode

【讨论】:

    【解决方案2】:

    根据 .NET 指南 - 如果您实现 == 始终提供 object.Equals() 和 != 运算符的实现。原因是运算符不是任何接口的一部分,并且不允许在泛型实现中使用它们(List 类不能在 T 上调用 == 运算符,因为不能保证 T 将定义运算符(参见结构示例) )。

    【讨论】:

      【解决方案3】:

      它会调用Object.Equals(),或者,如果你已经实现,IEquatable&lt;T&gt;.Equals()

      private static EqualityComparer<T> CreateComparer()
      {
          Type c = typeof(T);
          if (c == typeof(byte))
          {
              return (EqualityComparer<T>) new ByteEqualityComparer();
          }
          if (typeof(IEquatable<T>).IsAssignableFrom(c))
          {
              return (EqualityComparer<T>) typeof(GenericEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(c);
          }
          if (c.IsGenericType && (c.GetGenericTypeDefinition() == typeof(Nullable<>)))
          {
              Type type2 = c.GetGenericArguments()[0];
              if (typeof(IEquatable<>).MakeGenericType(new Type[] { type2 }).IsAssignableFrom(type2))
              {
                  return (EqualityComparer<T>) typeof(NullableEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(type2);
              }
          }
          return new ObjectEqualityComparer<T>();
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-22
        • 2011-12-13
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2010-10-13
        • 2012-09-21
        • 1970-01-01
        • 2012-03-05
        相关资源
        最近更新 更多