我有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
答案 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的那个仍然存在,因为它不在子集中。