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