2

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

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

2 回答 2

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>方法迭代或“实现”结果之前,它不会开始做任何事情。foreachToArrayToList

于 2012-11-14T08:49:01.220 回答
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,因此它现在包含两个原始列表之间的“差异元素”。

于 2012-11-14T09:31:02.730 回答