List <t> </t>的Contains()方法

时间:2009-10-19 15:30:58

标签: c# contains generic-list

确切地说,班级中的哪些方法负责List<T>的{​​{1}}运作?

我在班上超载了==。但它似乎没有效果。

3 个答案:

答案 0 :(得分:11)

它只会调用Equals() - 这就是所有需要被覆盖的(如果你对参考标识比较感到满意,则不会被覆盖)。如果类型实现IEquatable<T>,则该实现将优先于普通Equals(object)使用。

特别是,来自List<T>.Contains的文档:

  

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

来自EqualityComparer<T>.Default

  

Default属性检查是否   类型T实现了   System.IEquatable(T)通用接口   如果是这样的话   使用它的EqualityComparer(T)   实现。否则它会返回   一个EqualityComparer(T)使用   覆盖Object.Equals和。{   Object.GetHashCode提供T

我认为它根本不会使用GetHashCode

答案 1 :(得分:2)

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

答案 2 :(得分:1)

它会调用Object.Equals(),或者,如果已实施,则调用IEquatable<T>.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>();
}
相关问题