0
var resultList = list1.Intersect<XElement>(list2, new XElementComparer());

XElementComparer の GetHashCode メソッドが呼び出されないのはなぜですか?

resultList の内容を確認すると、次のように表示されます。

System.Exeception object to set to an instance of an object

私の両方のリストには XElements があります。私は何を間違っていますか?

4

2 に答える 2

3

Intersect拡張メソッドは を返しますが、列挙IEnumerable<>を開始するまで実際には共通部分を実行しません (例: do a foreach、 call.ToList()など)。そのため、結果を列挙していないため、指定したスニペットに基づいて比較子のメソッドが呼び出されるとは思いません。

于 2012-10-05T15:38:30.767 に答える
0

の実装を呼び出してGetHashCode おり、その実装 (またはEquals) が NullReferenceException をスローしていると思います。あなたの質問に本当に答えることができる唯一の方法は、 のコードを含めることですXElementComparer

この出力を生成する簡単なテストを実行しました。

カウント = 1 に等しい。GetHashCode カウント = 6

[Test]
public void X()
{
    var list1 = new List<Alpha> {new Alpha {Bravo = 1}, new Alpha {Bravo = 1}, new Alpha {Bravo = 2}};
    var list2 = new List<Alpha> { new Alpha { Bravo = 1 }, new Alpha { Bravo = 3 }, new Alpha { Bravo = 5 } };

    var alphaComparer = new AlphaComparer();

    Assert.AreEqual(1, list1.Intersect(list2, alphaComparer).Count());
    Console.WriteLine("Equals count = {0}; GetHashCode count = {1}", alphaComparer.EqualsCallCount, alphaComparer.GetHashCodeCallCount);
}

class Alpha
{
    public int Bravo { get; set; }
}

class AlphaComparer : IEqualityComparer<Alpha>
{
    public int EqualsCallCount { get; private set; }
    public int GetHashCodeCallCount { get; private set; }

    public bool Equals(Alpha x, Alpha y)
    {
        EqualsCallCount += 1;
        return x.Bravo.Equals(y.Bravo);
    }

    public int GetHashCode(Alpha obj)
    {
        GetHashCodeCallCount += 1;
        return obj.Bravo.GetHashCode();
    }
于 2012-10-05T15:48:19.073 に答える