你可以试试:
var result = listOne.Join(listTwo,
(one) => one,
(two) => two,
(one, two) => one,
new MyFooComparer());
凡MyFooComparer
可能看起来像:
class MyFooComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
return x.Id == y.Id && x.someKey != y.someKey;
}
public int GetHashCode(Foo obj)
{
return obj.Id.GetHashCode();
}
}
[更新]
我很好奇Intersect
与Join
的表现让我做我的解决方案,并@ PSWG的之间有一个小的性能比较(listOne
和listTwo
各有10个项目):
var comparer = new MyFooComparer();
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
var result1 = listOne.Intersect(listTwo, comparer).ToList();
}
Console.WriteLine("Intersect: {0}",sw.Elapsed);
sw.Restart();
for (int i = 0; i < 100000; i++)
{
var result = listOne.Join(listTwo,
(one) => one,
(two) => two,
(one, two) => one,
comparer);
}
Console.WriteLine("Join: {0}", sw.Elapsed);
输出:
Intersect: 00:00:00.1441810
Join: 00:00:00.0037063
不错,谢谢!如果我将第一列与第二列相交无关紧要,对吧? – Johan
@Johan我相信可能会有一些性能差异,这取决于哪一组更大。当然,如果你以一种不完全对称的方式实现'IEqualityComparer',那么它就会有所作为。 –
Sooo ...从最安全的角度开始吧? – Johan