2

こんにちはすべて私はそれが機能しない理由を理解することができませんいくつかの助けが必要です。私はリンクといくつかのデータを含むリストを持っています私はここにコードをリンクホストごとにリストを区別したいです

    public class DataContainerEqualityComparer : IEqualityComparer<DataContainer>
        {
            public bool Equals(DataContainer x, DataContainer y)
            {
                return x.Url.Host == y.Url.Host;
            }

            public int GetHashCode(DataContainer obj)
            {
                return obj.Url.GetHashCode();
            }
        }

List<DataContainer> items = new List<DataContainer>();
var item = new DataContainer("http://google.com/123");
items.Add(item);
item = new DataContainer("http://google.com/1234");
items.Add(item);
item = new DataContainer("http://google.com/12345");
items.Add(item);
item = new DataContainer("http://google.com/123456");
items.Add(item);
item = new DataContainer("http://google.com/1234567");
items.Add(item);                
items = items.Distinct(new DataContainerEqualityComparer()).ToList();

この後は何も起こりません。事前にThx。

4

1 に答える 1

17

の実装の問題DataContainerEqualityComparerは、ホストのハッシュ コードではなく、Url のハッシュ コードを返すことです。

これを次のように変更すると、期待どおりに動作するはずです。

public int GetHashCode(DataContainer obj)
{
    return obj.Url.Host.GetHashCode();
}

2 つのオブジェクトが等しいかどうかをチェックすると、次のことが起こります。

まず、GetHashCode両方のオブジェクトで呼び出されます。ハッシュ コードが異なる場合、オブジェクトは等しくないと見なされ、呼び出されることEqualsはありません。両方のオブジェクトに同じ値が返された場合にのみ呼び出されます。
EqualsGetHashCode

于 2013-01-15T16:01:37.263 に答える