0

我想知道是否有更好的方法(仍然使用 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

4

2 回答 2

5

我会使用两个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删除了重复项。

于 2013-10-14T13:04:03.407 回答
2

我认为这可行,但不确定它是否足够有效:

bool isEqual = list1.OrderBy(x=>x).SequenceEqual(list2.OrderBy(x=>x));
于 2013-10-14T13:10:32.180 回答