[英]How should I compare values in two lists?
我有两个清单
List 01 => { A, B, C, D, E }
List 02 => { F, F, F, F, E }
我需要检查的一个元素List 02
中是否存在List 01
,所以下面应该是false
。
List 01 => { A, B, C, D, E }
List 02 => { F, F, F, F, F } // no element matches
这应该是true
。
List 01 => { A, B, C, D, E }
List 02 => { F, F, F, F, B } // last element matches
我该怎么检查?
我也很关心表现 。
list1.Intersect(list2).Any()
这将是最高效的,因为它使用HashSet。
有几种不同的方法可以做到:
如果交集的结果导致1个或多个元素,则表示至少有一个相等的元素。
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>
作为第二个参数传递。
如果list01中的任何元素与list02中的任何元素相等,则表示至少有一个相等的元素。
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))
只有在第二个列表中包含的第一个in的开头的值之一时才会有良好的性能。 否则性能会很糟糕,因为迭代是连续的。
在性能测试中,我得到了以下结果:
每个列表包含5个元素,测试10000000次。
Intersect : 00:00:02.9260135
Except : 00:00:03.4404527
AnyAny : 00:00:06.5709693
AnyIndexOf : 00:00:01.9882278
每个列有100000个元素,测试500次。 list02的最后一个元素等于list01中的第三个元素:
Intersect : 00:00:02.4397784
Except : 00:00:04.2595364
AnyAny : 00:00:02.9761128
AnyIndexOf : 00:00:00.0919344
每个列有100000个元素,测试500次。 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
Enumerable.Except
& Enumerable.Intersect
。
尝试
list1.Any(e => list2.Contains(e));
例如
var list1 = new List<string> { "A", "B", "C", "D" };
var list2 = new List<string> { "F", "F", "F" };
list1.Any(e => list2.Contains(e)); // returns false
var list3 = new List<string> { "F", "F", "D" };
list1.Any(e => list3.Contains(e)); // returns true
更新:正如leppie指出的那样,使用Intersect将更具性能,尤其是如果列表很大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.