C# 使用简单列表筛选对象列表
本文关键字:列表 筛选 对象 简单 | 更新日期: 2023-09-27 18:30:58
这里对LINQ来说很新,我想知道如何实现这一点。我有以下代码:
var allOrgs = (from org in this.Context.Organizations select org).ToList();
var childOrgs = (from oc in this.Context.OrganizationChild select oc).ToList();
var parentOrgs = (from op in this.Context.OrganizationParent select op).ToList();
每个变量的返回值如下所示:
allOrgs = [{id=1}, {id=2}, {id=3}, {id=4}];
childOrgs = [{id=2}];
parentOrgs = [{id=3}];
我想过滤所有组织,以便只返回那些不在子组织或父组织中的项目,即
filteredList = [{id=1}, {id=4}];
我有以下 LINQ 筛选器(我需要一些帮助):
var filteredList = allOrgs.Where(a => childOrgs.Any(c => c.id != a.id));
filteredList = filteredList.Where(f => parentOrgs.Any(p => p.id != f.id));
return filteredList.ToList();
出于某种原因,我最终仍然得到了所有值......
欣赏任何见解。谢谢!
只需合并这两个条件:
filteredList = allOrgs.Where(a => !childOrgs.Any(c => c.id == a.id)
&& !parentOrgs.Any(c => c.id == a.id)
);
请注意,您的原始查询是向后的 - 它查找任何父组织或子组织不匹配的所有组织。
您可以使用
Except
:
var filteredList = allOrgs.Except(parentOrgs).Except(childOrgs).ToList();
添加到@DStanley答案...
您还可以执行以下操作:
var filteredList = allOrgs.Where(a => !childOrgs.Select(r => r.id).Contains(a.id)
&& !parentOrgs.Select(r => r.id).Contains(a.id));
这是一个演示