我想知道是否有更好的方法(仍然使用 LINQ)来实现以下目标,它检查这两者是否具有相同的数字:
var list1 = new int[] { 1, 2, 3, 4 };
var list2 = new int[] { 2, 1, 3, 4 };
return list1.Intersect(list2).Count() == list2.Count();
上面的例子将返回true
我想知道是否有更好的方法(仍然使用 LINQ)来实现以下目标,它检查这两者是否具有相同的数字:
var list1 = new int[] { 1, 2, 3, 4 };
var list2 = new int[] { 2, 1, 3, 4 };
return list1.Intersect(list2).Count() == list2.Count();
上面的例子将返回true
我会使用两个HashSet<int>
和SetEquals
方法:
var l1Lookup = new HashSet<int>(list1);
var l2Lookup = new HashSet<int>(list2);
bool containsSame = l1Lookup.SetEquals(l2Lookup); // true
SetEquals 方法忽略另一个参数中的重复条目和元素顺序。如果 other 表示的集合是与当前 HashSet 对象具有相同相等比较器的 HashSet 集合,则该方法是O(n) 操作。否则,此方法是 O(n + m) 操作,其中 n 是 other 中的元素数,m 是 Count。
如果序列很大或/并且它们不是集合而是昂贵的查询,您的Count()
方法可能效率低下。它也可能不正确,因为所有项目的计数不一定是相交项目的计数,因为Intersect
删除了重复项。
我认为这可行,但不确定它是否足够有效:
bool isEqual = list1.OrderBy(x=>x).SequenceEqual(list2.OrderBy(x=>x));