从列表条件中删除某些元素基于另一个列表

Joy*_*Joy 3 linq list

我在这里遇到了一个基本的问题.虽然这可以通过重复循环来解决.我想知道如何在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" };
Run Code Online (Sandbox Code Playgroud)

我想比较列表a和b中找到的b中的哪个元素.我想从b中删除该元素.换句话说,我想根据列表a的比较从b中删除{"a","b","c"},并且只想在列表b中包含{"x","y","z"}.是否有单一声明linq来解决这个问题?

Jon*_*eet 7

(我确定这是几天前另一篇文章的重复,但我找不到它......)

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

b.RemoveAll(x => a.Contains(x));
Run Code Online (Sandbox Code Playgroud)

或者更有效(如果列表很大):

HashSet<string> set = new HashSet<string>(a);
b.RemoveAll(set.Contains);
Run Code Online (Sandbox Code Playgroud)

请注意,在LINQ中修改集合并不是惯用的,这就是上面使用.NET 2特定于列表的方法的原因.

或者,如果您很乐意改为b引用新列表,那么您可以使用LINQ:

b = b.Except(a).ToList();
Run Code Online (Sandbox Code Playgroud)