我想与通用列表进行比较,并过滤不匹配的值。我目前正在使用foreach循环,但我想知道是否有办法使用lambda表达式来解决这个问题?在下面的示例中,我想要一个仅包含“4”的结果列表。
List<string> foo = new List<string>() { "1", "2", "3" };
List<string> bar = new List<string>() { "1", "2", "3", "4" };
答案 0 :(得分:4)
使用Linq Except<>
扩展程序:
var result = bar.Except(foo);
在内部,这会将所有foo
添加到Set<>
(类似于HashSet<T>
的内部.Net类型)中,然后从bar
生成所有已成功添加的项目
注意 - 如果您需要不区分大小写的比较,则可以传递特定的StringComparer
:
var result = bar.Except(foo, StringComparer.OrdinalIgnoreCase);
结果是IEnumerable<string>
,并且与许多其他Linq扩展方法一样,在您使用foreach
进行迭代或者实现&#39;之前,它不会开始执行任何操作。调用ToArray
或ToList
或其他任何内容的结果。
答案 1 :(得分:1)
如果您不想两次使用Except
,请考虑以下事项:
var listOld = new SortedSet<string> { "1", "2", "3", "4", };
var listNew = new SortedSet<string> { "1", "1½", "2", "4", "5", };
然后简单地说
listNew.SymmetricExceptWith(listOld);
将修改listNew
,因此它现在包含两个原始列表之间的“差异元素”。