从一个列表中删除特定元素,基于另一个列表的条件

3

我在使用LINQ时遇到了一个基本问题,虽然可以通过重复循环来解决。但我想知道如何在LINQ中完成这个操作。

我有两个列表。

List<string> a  = new List<string>{"a","b","c","d","e","f"};
List<string> b = new List<string> { "a", "b", "c", "x", "y", "z" };

我想要将列表b中与列表a中的元素进行比较,如果找到相同的元素,则从b中删除该元素。换句话说,我想要基于与列表a的比较从b中删除{"a","b","c"}并且只保留{"x","y","z"}在列表b中。是否有一个单一的linq语句可以解决这个问题?

1个回答

7

(我确定这是几天前发布的另一个帖子的重复,但我找不到它...)

如果您需要进行现场修改,您可以使用List<T>.RemoveAll

b.RemoveAll(x => a.Contains(x));

更高效的方法是(如果列表很大):
HashSet<string> set = new HashSet<string>(a);
b.RemoveAll(set.Contains);

请注意,在LINQ中,直接修改集合不是惯用的做法,这就是为什么上面使用了.NET 2中特定于列表的方法。
或者,如果你愿意将b更改为引用一个新列表,那么你可以使用LINQ:
b = b.Except(a).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接