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: 1, 4
}
答案 0 :(得分:345)
如上所述,如果你想得到4作为结果,你可以这样做:
var nonintersect = array2.Except(array1);
如果你想要真正的非交叉(也是1和4),那么这应该可以解决问题:
var nonintersect = array1.Except(array2).Union( array2.Except(array1));
这不是最高性能的解决方案,但对于小型列表,它应该可以正常工作。
答案 1 :(得分:81)
您可以使用
a.Except(b).Union(b.Except(a));
或者您可以使用
var difference = new HashSet(a);
difference.SymmetricExceptWith(b);
答案 2 :(得分:11)
此代码仅枚举每个序列一次,并使用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);
}
答案 3 :(得分:4)
我认为您可能正在寻找Except
:
Except运算符生成集合 两个序列之间的差异。它 只返回第一个元素 序列中没有出现的 第二。您可以选择提供 你自己的平等比较函数。
答案 4 :(得分:2)
我不是100%确定您的NonIntersect方法应该做什么(关于集合论) - 是不是
B \ A(B中不存在于A中的所有内容)?
如果是,那么你应该能够使用Except操作(B.Except(A))。
答案 5 :(得分:2)
/// <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);
}
}
答案 6 :(得分:1)
array1.NonIntersect(数组2);
Nonintersect这样的运算符在Linq中不存在你应该做
除了 - &gt;联盟 - &gt;除
a.except(b).union(b.Except(a));
答案 7 :(得分:-1)
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"