首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Intersect()的对立面

Intersect()的对立面
EN

Stack Overflow用户
提问于 2011-04-11 10:53:44
回答 8查看 141.6K关注 0票数 319

Intersect可用于查找两个集合之间的匹配,如下所示:

代码语言:javascript
复制
// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call Intersect extension method.
var intersect = array1.Intersect(array2);
// Write intersection to screen.
foreach (int value in intersect)
{
    Console.WriteLine(value); // Output: 2, 3
}

然而,我想要实现的正好相反,我想从一个集合中列出一个项,而另一个中缺少这些项

代码语言:javascript
复制
// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call "NonIntersect" extension method.
var intersect = array1.NonIntersect(array2); // I've made up the NonIntersect method
// Write intersection to screen.
foreach (int value in intersect)
{
    Console.WriteLine(value); // Output: 4
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-04-11 10:56:20

如前所述,如果您想得到4作为结果,您可以这样做:

代码语言:javascript
复制
var nonintersect = array2.Except(array1);

如果您想要真正的非交集(也包括1和4),那么这应该可以做到:

代码语言:javascript
复制
var nonintersect = array1.Except(array2).Union( array2.Except(array1));

这将不是最具表现力的解决方案,但是对于小的列表,它应该工作得很好。

票数 435
EN

Stack Overflow用户

发布于 2011-04-11 10:57:16

您可以使用

代码语言:javascript
复制
a.Except(b).Union(b.Except(a));

或者你可以用

代码语言:javascript
复制
var difference = new HashSet(a);
difference.SymmetricExceptWith(b);
票数 95
EN

Stack Overflow用户

发布于 2011-04-11 11:00:36

此代码只枚举每个序列一次,并使用Select(x => x)隐藏结果以获得干净的Linq样式扩展方法。由于它使用HashSet<T>,如果散列很好地分布,它的运行时就是O(n + m)。省略两个列表中的重复元素。

代码语言:javascript
复制
public static IEnumerable<T> SymmetricExcept<T>(this IEnumerable<T> seq1,
    IEnumerable<T> seq2)
{
    HashSet<T> hashSet = new HashSet<T>(seq1);
    hashSet.SymmetricExceptWith(seq2);
    return hashSet.Select(x => x);
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5620266

复制
相关文章

相似问题

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