2

我已经编写了以下代码以Linq.Distinct(IEqualityComparer)尽可能最基本的方式实现,但是simpleCollection如果为 1,则返回 2 项。

奇怪的是,我注意到断点Equals永远不会被击中。

这可能与我的实施有关GetHashCode()吗?

    public class testobjx
    {
        public int i { get; set; }
    }

    public  class mytest
    {
        public Main()
        {
            var simpleCollection = new[] { new testobjx() { i = 1 }, new testobjx() { i = 1 } }.Distinct(new DistinctCodeType());
            var itemCount = simpleCollection.Count();//this should return 1 not 2.
        }
    }

    public class DistinctCodeType : IEqualityComparer<testobjx>
    {
        public bool Equals(testobjx x, testobjx y)
        {
            return x.i == y.i;
        }

        public int GetHashCode(testobjx obj)
        {
            return obj.GetHashCode();
        }
    }
4

2 回答 2

5

尝试:

public int GetHashCode(testobjx obj)
{
    if (obj == null) return 0;
    return obj.i.GetHashCode();
}
于 2012-10-16T16:48:30.790 回答
1

对象的GetHashCode的默认实现是基于对象的实例,因此具有相同值的两个testobjx实例具有不同的哈希码。您需要修改 GetHashCode 方法以询问对象的属性。如果对象有多个属性,您需要找出唯一标识对象所需的属性并从中组成单个哈希码。

于 2012-10-16T17:01:49.257 回答