使用LINQ检查两个列表是否包含相同的数字

时间:2013-10-14 13:00:05

标签: c# linq ienumerable

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

2 个答案:

答案 0 :(得分:5)

我会使用两个HashSet<int>SetEquals方法:

var l1Lookup = new HashSet<int>(list1);
var l2Lookup = new HashSet<int>(list2);
bool containsSame = l1Lookup.SetEquals(l2Lookup);  // true
  

SetEquals方法忽略重复的条目和顺序   其他参数中的元素。如果集合代表   另一个是具有相同等式比较器的HashSet集合   当前的HashSet对象,此方法是 O(n)操作。   否则,此方法是O(n + m)操作,其中n是数字   其他和m中的元素是Count。

如果序列很大或/并且它们不是集合而是昂贵的查询,那么Count()方法可能效率低下。 也可能不正确,因为所有项目的计数不一定是交叉项目的计数,因为Intersect会删除重复项。

答案 1 :(得分:2)

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

bool isEqual = list1.OrderBy(x=>x).SequenceEqual(list2.OrderBy(x=>x));