2

Linq.Distinct(IEqualityComparer)可能な限り最も基本的な方法で実装するために次のコードを記述しましたがsimpleCollection、1の場合は代わりに2つのアイテムを返します。

Equals奇妙なことに、iveは上のブレークポイントがヒットしないことに気づきました。

それは私の実装と関係があるの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 の 2 つのインスタンスは異なるハッシュ コードを持ちます。オブジェクトのプロパティを調べるには、GetHashCode メソッドを変更する必要があります。オブジェクトに複数のプロパティがある場合、オブジェクトを一意に識別するために必要なプロパティを特定し、それらから単一のハッシュ コードを作成する必要があります。

于 2012-10-16T17:01:49.257 に答える