使用linq从集合中删除项目

时间:2014-02-11 01:54:41

标签: c# linq

我有一个按预期工作的查询。如果mastercollection不存在MyCollection中存在的相应AssocaitedProp,则从MyCollection中删除该项

public class classB
{
    public classX AssociatedProp { get; set; }
}

    List<classX> MyCollection;
    List<classB> masterCollection;

    MyCollection.RemoveAll(x =>
                    MyCollection.Except(
                     (from n in masterCollection
                      select n.AssociatedProp).Distinct()).ToList().Contains(x)
                     );

此查询将删除MyCollection中不在masterCollection中的所有项目。

现在我已将MyCollection修改为classC

的集合
public class classC
{
    bool flag { get; set; }
    classX myObj { get; set; }
}

List<classC> myCollection;
List<classB> masterCollection;

和 列出MyCollection

如何获得相同的结果。即如果masterCollection没有MyCollection中存在ClassX值的任何项目,则从MyCollection中删除所有项目

我知道解释不够明确。

1 个答案:

答案 0 :(得分:3)

var toKeep = new HashSet(masterCollection.Select(x => x.AssociatedProp));

foreach(var x in myCollection.Where(i => toKeep.Contains(i.myObj) == false).ToList())
{
    myCollection.Remove(x);
}

您希望将搜索列表置于lambda之外,否则您将为每个项目重新创建它。您还需要一个HashSet,因为它们是搜索速度最快的集合。