var resultList = list1.Intersect<XElement>(list2, new XElementComparer());
为什么我的 XElementComparer 的 GetHashCode 方法从未被调用?
当我检查 resultList 的内容时,我看到:
System.Exeception object to set to an instance of an object
我的两个列表都有 XElements。我错了什么?
Intersect
扩展方法返回一个,但在IEnumerable<>
您开始枚举它之前并不实际执行交集(例如,做一个foreach
,调用.ToList()
等)。因此,我不希望根据您提供的代码段调用比较器上的任何方法,因为您没有枚举结果。
我敢打赌它正在调用您的实现,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();
}