试图从两个List <int>对象中获取不同的值

Sla*_*der 8 .net .net-3.5

我有2个List对象:

List<int> lst1 = new List<int>();
List<int> lst2 = new List<int>();
Run Code Online (Sandbox Code Playgroud)

让我们说他们有价值观:

lst1.Add(1);
lst1.Add(2);
lst1.Add(3);
lst1.Add(4);

lst2.Add(1);
lst2.Add(4);
Run Code Online (Sandbox Code Playgroud)

我需要得到一个包含这两者的"不同"列表的对象; 所以在这种情况下,返回将是List {2,3}.

是否有捷径可寻?或者我是否需要遍历列表中的每个值并进行比较?

我愿意使用ObjectQuery,LINQ等,因为这些列表来自数据库,并且可能长达数百到数千个条目.

谢谢!

Jon*_*eet 13

Except我相信艾哈迈德几乎是正确的- 但这不会给你那些在lst2但不在的物品lst1.所以在你给出的例子中,如果你加了5 lst2,我想你想要的结果是{2,3,5}.在这种情况下,您需要对称差异.我认为在单个调用中没有任何方法可以直接在LINQ to Objects中执行此操作,但您仍然可以实现它.这是一种简单但低效的方法:

lst1.Union(lst2).Except(lst1.Intersect(lst2)).ToList();
Run Code Online (Sandbox Code Playgroud)

(显然你只需要ToList()真正需要一个List<T>而不是一个IEnumerable<T>.)

阅读本文的方法是"我想要列在任何一个列表中的项目,但不是两个列表中的项目."

使用它可能更有效Concat- 这仍然可以像Except基于集合的运算符一样工作,它只会返回不同的结果:

lst1.Concat(lst2).Except(lst1.Intersect(lst2)).ToList();
Run Code Online (Sandbox Code Playgroud)


Ahm*_*eed 6

编辑:感谢您的评论,您需要做一些额外的工作,除了Except用于获得对称的差异.如果向第二个列表添加了附加值,则除了单独的值之外.为了得到正确的结果,试试这个:

var list1 = new List<int>(Enumerable.Range(1,4));
var list2 = new List<int> { 1, 4, 6 };

var result = list1.Except(list2).Union(list2.Except(list1));
Run Code Online (Sandbox Code Playgroud)

以上返回{2,3,6}.

请注意,ToList()如果您确实需要List<int>,则需要添加一个,否则上面的操作将返回一个IEnumerable<int>.


使用Enumerable.Except方法,该方法生成两个序列的集合差异:

var result = lst1.Except(lst2);
Run Code Online (Sandbox Code Playgroud)

  • 它适用于这个例子,但是`Except`给出了设定差异,而不是对称差异.特别是,`lst2.Except(lst1)`会给出不同的答案(空列表). (4认同)