我有两个列表:ListA<A>
和ListB<B>
对象结构:
对象A: - commonID,AName
对象B: - commonID,BName
现在我的目标非常简单,我尝试删除ListA
中与commonID
具有相同ListB
的所有项目。以下是我的尝试:
foreach(var item in ListB)
ListA.Remove(x=>x.commonID == item.commonID)
它抛出异常:
Cannot convert lambda expression to type 'A' because it is not a delegate type
我可以知道我做错了哪一部分?
答案 0 :(得分:4)
您目前正在使用Remove
(需要删除单个项目),而不是RemoveAll
(使用谓词)。
但是,更好的方法可能是创建一组要删除的所有ID,然后使用一次调用RemoveAll
:
HashSet<string> idsToRemove = new HashSet<string>(ListB.Select(x => x.commonID));
ListA.RemoveAll(x => idsToRemove.Contains(x.commonID));
或者,如果您的列表足够小,以至于您不担心它是O(N * M)操作,您可以使用:
ListA.RemoveAll(x => ListB.Any(y => x.commonID == y.commonID));
答案 1 :(得分:1)
Remove方法不接受谓词,而是接受实际项目。因此,您的错误消息意味着您的lambda表达式无法转换为类型A的预期项。
RemoveAll采用谓词:
ListA.RemoveAll(item => ListB.Any(x => x.CommonId == item.CommonID));
现在你甚至不需要外循环。