生成具有两个通用列表的交集和分解列表

时间:2011-07-20 18:20:49

标签: c# linq

假设我们有两个List<int>

List<int> list1 = new List<int> { 1, 3, 5, 7 , 9, 11, 18 };
List<int> list2 = new List<int> { 2, 3, 5, 7 , 9, 10, 20, 26, 36 };

质疑我该如何制作;

intersect  {3, 5, 7, 9 }
list1Decomp  { 1, 11, 18 }
list2Decomp  { 2, 10, 20, 26, 36 }

提前感谢。

3 个答案:

答案 0 :(得分:6)

var intersection = list1.Intersect(list2).ToList();
var list1Decomp = list1.Except(intersection).ToList();
var list2Decomp = list2.Except(intersection).ToList();

答案 1 :(得分:1)

简而言之:

 intersect = list1.Intersect(list2);
 list1Decomp = list1.Except(list2);
 list2Decomp = list2.Except(list1);

这些算法在有序集合上最有效(HashSet&lt;&gt;例如。)

同样提防在自定义类型的集合上使用这些算法;他们真的需要好的IEquatable&lt;&gt;支持(即实现接口并提供自己的GetHashCode和Equals)。否则,结果将不是您所期望的

虽然您没有问,但您可能会:

 symmDifference = list1.Union(list2).Except(list1.Intersect(list2))

 symmDifference = new HashSet<int>(list1).SymmetricExceptWith(list2)

答案 2 :(得分:1)

var intersect = list1.Intersect(list2);
var list1Decomp = list1.Except(list2);
var list2Decomp = list2.Except(list1);