List.Distinct()和==不使用我的相等比较

时间:2015-07-04 12:08:08

标签: c#

我试图让几个操作使用相同的比较方法,但我无法让它们全部使用它。在下面的代码中,我设置了一个断点来检查哪些操作正在使用它。我的结果显示,虽然List.Contains()确实使用它,但List.Distinct()和“==”却没有。

如何让所有3个人使用我的平等比较?

namespace ConsoleApplication3
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<TestObject> list1 = new List<TestObject>();
                list1.Add(new TestObject("test1"));
                list1.Add(new TestObject("test1"));
                List<TestObject> list2 = list1.Distinct().ToList();
                if (list1[0] == list1[1]) { }
                if (list2.Contains(list1[0])){ }
            }
        }
        class TestObject: IEquatable<TestObject>
        {
            string name;
            public TestObject(string name)
            {
                this.name = name;
            }

            public bool Equals(TestObject other)
            {
                return this.name == other.name;
            }
        }
    }

谢谢

2 个答案:

答案 0 :(得分:1)

对于IEnumerable<T>Distinct使用默认的IEquatableComparer<T>比较器(除非您传递自己的比较器)。在内部,这依赖于GetHashCode来执行相等性检查,而Contains使用Equals,因此它们不会产生相同的结果。

通常建议您在实施自己的自定义相等检查时覆盖EqualsGetHashCode,请参阅Guidelines for Overloading Equals() and == Operator

答案 1 :(得分:0)

==通常用于确定两个引用是否相同。如果要为类更改此行为,则需要根据此处的说明覆盖==运算符:

https://msdn.microsoft.com/en-US/library/ms173147(v=vs.80).aspx