首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ:确定两个序列是否包含完全相同的元素

LINQ:确定两个序列是否包含完全相同的元素
EN

Stack Overflow用户
提问于 2009-11-04 19:57:29
回答 5查看 36K关注 0票数 71

我需要确定两个集合是否包含完全相同的元素。顺序并不重要。

例如,这两个数组应该被视为相等:

代码语言:javascript
复制
IEnumerable<int> data = new []{3, 5, 6, 9};
IEnumerable<int> otherData = new []{6, 5, 9, 3}

一个集合不能包含任何不在另一个集合中的元素。

使用内置的查询操作符可以做到这一点吗?考虑到元素的数量可能从几个到数百个,什么是实现它的最有效的方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-04 20:06:40

如果您希望将数组视为“集合”并忽略顺序和重复项,则可以使用HashSet.SetEquals method

代码语言:javascript
复制
var isEqual = new HashSet<int>(first).SetEquals(second);

否则,最好的办法可能是以相同的方式对两个序列进行排序,并使用SequenceEqual对它们进行比较。

票数 122
EN

Stack Overflow用户

发布于 2009-11-04 20:05:19

我建议对两者进行排序,并进行逐个元素的比较。

代码语言:javascript
复制
data.OrderBy(x => x).SequenceEqual(otherData.OrderBy(x => x))

我不确定OrderBy的实现有多快,但如果它是O( not )排序,就像你预期的那样,总算法也是O(Not)。

对于某些数据情况,您可以通过使用OrderBy的自定义实现来改进这一点,例如,对于O(n+k)使用计数排序,其中k表示值所在的范围的大小。

票数 47
EN

Stack Overflow用户

发布于 2015-08-22 02:39:28

这是另一种方法:

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1673347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档