我需要确定两个集合是否包含完全相同的元素。顺序并不重要。
例如,这两个数组应该被视为相等:
IEnumerable<int> data = new []{3, 5, 6, 9};
IEnumerable<int> otherData = new []{6, 5, 9, 3}
一个集合不能包含任何不在另一个集合中的元素。
使用内置的查询操作符可以做到这一点吗?考虑到元素的数量可能从几个到数百个,什么是实现它的最有效的方法?
发布于 2009-11-04 20:06:40
如果您希望将数组视为“集合”并忽略顺序和重复项,则可以使用HashSet.SetEquals
method
var isEqual = new HashSet<int>(first).SetEquals(second);
否则,最好的办法可能是以相同的方式对两个序列进行排序,并使用SequenceEqual
对它们进行比较。
发布于 2009-11-04 20:05:19
我建议对两者进行排序,并进行逐个元素的比较。
data.OrderBy(x => x).SequenceEqual(otherData.OrderBy(x => x))
我不确定OrderBy
的实现有多快,但如果它是O( not )排序,就像你预期的那样,总算法也是O(Not)。
对于某些数据情况,您可以通过使用OrderBy的自定义实现来改进这一点,例如,对于O(n+k)使用计数排序,其中k表示值所在的范围的大小。
发布于 2015-08-22 02:39:28
这是另一种方法:
IEnumerable<int> data = new[] { 3, 5, 6, 9 };
IEnumerable<int> otherData = new[] { 6, 5, 9, 3 };
data = data.OrderBy(d => d);
otherData = otherData.OrderBy(d => d);
data.Zip(otherData, (x, y) => Tuple.Create(x, y)).All(d => d.Item1 == d.Item2);
https://stackoverflow.com/questions/1673347
复制相似问题