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"