有几种不同的方法来做到这一点:
如果交集的结果中有一个或多个元素,则表示至少有一个相等的元素。
var result = list01.Intersect(list02);
bool hasElement = result.Any();
我建议使用这种方法。
如果您需要比较复杂类型,可以将IEqualityComparer<T>
作为第二个参数传递。
如果except的结果总共有不同数量的元素,则表示至少存在一个相等的元素。
var result = list01.Except(list02);
bool hasElement = result.Count() != list01.Count;
如果需要比较复杂类型,则可以将 IEqualityComparer<T>
作为第二个参数传递。
如果列表01中的任何元素等于列表02中的任何元素,则表示至少存在一个相等的元素。
bool hasElement = list01.Any(e => list02.Any(o => o == e));
如果在list02中找到了list01中的任何一个元素,那么就意味着至少存在一个相等的元素。
bool hasElement = list01.Any(e => list02.IndexOf(e) != -1);
IndexOf
的缺点是无法传递
IEqualityComparer<T>
,相反它总会使用默认值
EqualityComparer<T>.Default
。
性能
在一个大列表中,只有当第一个值包含在第二个列表中时,list01.Any(e => list02.Any(o => o == e))
才能具有良好的性能。否则,性能将非常糟糕,因为迭代是连续的。
在性能测试中,我得到了以下结果:
每个列表都有5个元素,测试了10000000次。
Intersect : 00:00:02.9260135
Except : 00:00:03.4404527
AnyAny : 00:00:06.5709693
AnyIndexOf : 00:00:01.9882278
每个列表中有10万个元素,测试500次。list02的最后一个元素等于list01中的第三个元素:
Intersect : 00:00:02.4397784
Except : 00:00:04.2595364
AnyAny : 00:00:02.9761128
AnyIndexOf : 00:00:00.0919344
测试了500次,每个列表都有100000个元素。list02的最后一个元素等于list01中的最后一个元素。
Intersect : 00:00:02.4927969
Except : 00:00:04.2668677
AnyAny : more than a minute and I dropped the test
AnyIndexOf : more than a minute and I dropped the test