使用LINQ基于条件从SuperSet中删除子集

时间:2014-07-25 13:45:07

标签: c# linq

我有2个列表,一个是超级集,另一个是子集。我想要做的是删除超集中基于ID的子集中存在的所有项目。

这就是我现在所做的事情:

var newList = new List<Items>();
foreach(var row in superset)
{
  var presentInSubset = subset.Any(r => r.ID == row.ID);

  if(!presentInSubset)
  {
    newList.Add(row)
  }
}

superset = newList;

我确信有一种更短的方法来实现这一点,而不是使用LINQ。问题是,如何根据某些标准从超集中删除子集?

谢谢, -Mike

3 个答案:

答案 0 :(得分:4)

superset.RemoveAll(x => subset.Select(y => y.ID).Contains(x.ID));

答案 1 :(得分:2)

var cleanList = superSet.Where(s => !subSet.Any(sub => sub.ID == s.ID)).ToList();

尝试以上方法。但这并没有改变原始列表。它改为返回一个新的清理列表。

答案 2 :(得分:1)

另一种(有效的)方法是使用Enumerable.Join,你需要一个“左外连接”,因为你想要超级中的所有不在子中:

var inSuper = from iSuper in superset
              join iSub in subset
              on iSuper.ID equals iSub.ID into gj
              from subJoin in gj.DefaultIfEmpty()
              where subJoin == null
              select iSuper;
superset = inSuper.ToList();

使用此示例数据:

var superset = new List<Items>() { 
    new Items{ID=1}, new Items{ID=2}, new Items{ID=3}, 
};
var subset = new List<Items>() { 
    new Items{ID=1}, new Items{ID=4}, new Items{ID=3}, 
};

只有ID = 2的那个仍然存在,因为它不在子集中。