Intersect()的相反

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

// 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 } 

然而,我想实现的是相反的,我想列出比较两个集合时丢失的项目

 // Assign two arrays. int[] array1 = { 1, 2, 3 }; int[] array2 = { 2, 3, 4 }; // Call Intersect 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 } 

如上所述,如果你想得到4结果,你可以这样做:

 var nonintersect = array2.Except(array1); 

如果你想要真正的非交叉(也是1和4),那么这应该做的伎俩:

 var nonintersect = array1.Except(array2).Union( array2.Except(array1)); 

这不会是最高性能的解决scheme,但对于小列表,它应该工作得很好。

您可以使用

 a.Except(b).Union(b.Except(a)); 

或者你可以使用

 var difference = new HashSet(a); difference.SymmetricExceptWith(b); 

此代码枚举每个序列只有一次,并使用Select(x => x)来隐藏结果,以获得一个干净的Linq风格的扩展方法。 由于它使用HashSet<T>如果散列分布良好,则其运行时间为O(n + m) 。 两个列表中的重复元素均被省略。

 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); } 

我想你可能正在寻找Except

Except运算符产生两个序列之间的设定差异。 它只会返回第一个序列中没有出现在第二个序列中的元素。 您可以select提供您自己的相等比较function。

看看这个链接 , 这个链接 ,或谷歌,了解更多信息。

我不是100%确定你的NonIntersect方法应该做什么(关于集合论) – 是吗?
B \ A(B中所有不在A中出现的东西)?
如果是,那么你应该可以使用Except操作(B.Except(A))。

 /// <summary> /// Given two list, compare and extract differences /// http://stackoverflow.com/questions/5620266/the-opposite-of-intersect /// </summary> public class CompareList { /// <summary> /// Returns list of items that are in initial but not in final list. /// </summary> /// <param name="listA"></param> /// <param name="listB"></param> /// <returns></returns> public static IEnumerable<string> NonIntersect( List<string> initial, List<string> final) { //subtracts the content of initial from final //assumes that final.length < initial.length return initial.Except(final); } /// <summary> /// Returns the symmetric difference between the two list. /// http://en.wikipedia.org/wiki/Symmetric_difference /// </summary> /// <param name="initial"></param> /// <param name="final"></param> /// <returns></returns> public static IEnumerable<string> SymmetricDifference( List<string> initial, List<string> final) { IEnumerable<string> setA = NonIntersect(final, initial); IEnumerable<string> setB = NonIntersect(initial, final); // sum and return the two set. return setA.Concat(setB); } } 

array1.NonIntersect(数组2);

与Linq不存在这样的操作符,你应该这样做

除了 – > union – >除外

 a.except(b).union(b.Except(a)); 
 string left = "411329_SOFT_MAC_GREEN"; string right= "SOFT_MAC_GREEN"; string[] l = left.Split('_'); string[] r = right.Split('_'); string[] distinctLeft = l.Distinct().ToArray(); string[] distinctRight = r.Distinct().ToArray(); var commonWord = l.Except(r, StringComparer.OrdinalIgnoreCase) string result = String.Join("_",commonWord); result = "411329"