C# 删除不在列表中但工作不正常的项目

C# 删除不在列表中但工作不正常的项目,c#,linq,C#,Linq,假设我有两个T列表,我需要从列表A中删除列表B中没有的所有元素。我这样做: A.RemoveAll(item => !B.Contains(item)); 这工作得很好,但是如果列表B不包含任何元素,则此代码将从列表A中删除所有项目,并且不应该删除。为什么会这样?之所以会这样,是因为!B.Contains(item)为A中的所有元素返回true。如果不希望发生这种情况,只需检查B是否为空: A.RemoveAll(item => B.Any() && !B.Cont

假设我有两个
T
列表,我需要从列表
A
中删除列表
B
中没有的所有元素。我这样做:

A.RemoveAll(item => !B.Contains(item));

这工作得很好,但是如果列表
B
不包含任何元素,则此代码将从列表
A
中删除所有项目,并且不应该删除。为什么会这样?

之所以会这样,是因为
!B.Contains(item)
A
中的所有元素返回true。如果不希望发生这种情况,只需检查
B
是否为空:

A.RemoveAll(item => B.Any() && !B.Contains(item));

这是因为列表B不包含任何项。你说的是从A中删除B中不存在的所有内容。实际上是说删除所有内容,因为B没有任何内容,这是因为如果
B
为空,对于
A
表达式
中的所有元素!B.包含(项)

试试这个:

A.RemoveAll(item => B.Count > 0 && !B.Contains(item));
或者,如果
B
为空,最好避免迭代:

if (B.Count > 0) A.RemoveAll(item => !B.Contains(item));

它删除了所有内容,因为条件对于列表A中的所有项目都是真的

如果列表B不是空的,则只从A中删除项目:

if(B.Any())
    A.RemoveAll(item => !B.Contains(item));

这个很好用,谢谢!我不明白你为什么要用Any而不是Count来编辑这个问题,也许其他用户可以解释一下,在
列表上使用
Any()
方法不是个好主意,因为它使用枚举数而不是
Count
属性。@YohDeadfall:那又怎么样?但是
Any
比清点物品更有意义。特别是对于集合,
Any
的开销可以忽略不计。对于其他类型,您无论如何都必须使用它。但是,检查一次总比检查一次好。换言之: