如何实现List.Remove对两个不同的对象列表?

时间:2014-03-17 06:39:21

标签: c# list

我有两个列表: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

我可以知道我做错了哪一部分?

2 个答案:

答案 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));

现在你甚至不需要外循环。