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();

出于某种原因,我最终仍然得到了所有值......

欣赏任何见解。谢谢!

C# 使用简单列表筛选对象列表

只需合并这两个条件:

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

这是一个演示