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