比较通用列表和过滤器不匹配值

时间:2012-11-14 08:47:28

标签: c# asp.net

我想与通用列表进行比较,并过滤不匹配的值。我目前正在使用foreach循环,但我想知道是否有办法使用lambda表达式来解决这个问题?在下面的示例中,我想要一个仅包含“4”的结果列表。

List<string> foo = new List<string>() { "1", "2", "3" };
List<string> bar = new List<string>() { "1", "2", "3", "4" };

2 个答案:

答案 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;之前,它不会开始执行任何操作。调用ToArrayToList或其他任何内容的结果。

答案 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,因此它现在包含两个原始列表之间的“差异元素”。