我有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)
编辑:感谢您的评论,您需要做一些额外的工作,除了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)
| 归档时间: |
|
| 查看次数: |
5887 次 |
| 最近记录: |