c# - 有没有办法将这两个 LINQ 语句合并为一个

标签 c# .net linq

我需要从 1 个列表中生成 2 个单独的列表。如果 company.IsNone 为真,我希望将所有员工添加到与 locationsToCompare 列表匹配的第一个列表中,如果不为真,我希望所有与 locationsToCompare 列表不匹配的员工。这与填充第二个列表时完全相反。有没有办法将这两个 if 语句合并为一个,或者我是否被迫使用两个单独的语句来填充两个列表?

var noneEmployees = company.IsNone
       ? employees.Where(employee => locationsToCompare.Any(x => x.ID == employee.LocationID)).ToList()
       : employees.Where(employee => locationsToCompare.All(x => x.ID != employee.LocationID)).ToList();

var locationEmployees = company.IsNone
       ? employees.Where(employee => locationsToCompare.All(x => x.ID != employee.LocationID)).ToList()
       : employees.Where(employee => locationsToCompare.Any(x => x.ID == employee.LocationID)).ToList();

最佳答案

员工组取决于是否设置了公司 IsNone 标志。

但在解决这个问题之前,让我们使用 ToLookup(TSource, TKey) 对员工进行分组这是一个字典/分组类型查找,其中关键是员工是否在 locationsToCompare 列表中。

查找设置完成后,我们可以在公司 IsNone 标志中添加管道并提取员工。


示例设置数据

var employees = new List<Employee>
         { new Employee { LocationID = 1, Name = "Hamilton" },
           new Employee { LocationID = 2, Name = "Joe"      },
           new Employee { LocationID = 1, Name = "Frank"    },
           new Employee { LocationID = 5, Name = "Reynolds" } };

var company = new Company() { IsNone = false };

地点

var locationsToCompare = new List<Location> { new Location() { ID = 1 },
                                              new Location() { ID = 2 } };

包含

我最终会使用 Contains代替 where 子句,所以我会将 locationsToCompare 提取到一个 ID 列表中。

var LocationIds = locationsToCompare.Select(ltc => ltc.ID);

这一步可以跳过,但我相信它更容易维护。

ToLookUp

现在我们使用 ToLookup,然后根据公司的“IsNone”标志提取我们的列表:

var empLookup = employees.ToLookup(emp => LocationIds.Contains(emp.LocationID));

var noneEmployees     = empLookup[company.IsNone].ToList();
var locationEmployees = empLookup[!company.IsNone].ToList();

结果

enter image description here


查找是什么样的?因为它为我们做了繁重的工作。

enter image description here

关于c# - 有没有办法将这两个 LINQ 语句合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32875697/

相关文章:

c# - CA1416。如何告诉构建器只有平台是 Windows?

c# - 我可以减少 WPF 应用程序中手写笔/触摸输入的开销吗?

c# - XDocument.Save() 在每个 XElement 上添加不需要的命名空间

c# - 是否可以将字符串用于 LINQ 查询表达式?

c# - 在 C# 中调用 super 构造函数

c# - 具有默认值的 XmlSerializer 和 List<T>

c# Win Form - 无法更改 WebBrowser 控件中 "input"的文本

.net - 类型 'System.Windows.Data.Binding' 的对象无法转换为类型 'System.String'

c# - 如何清除 System.Net 客户端 DNS 缓存?

c# - 使用 LINQ 获取 IEnumerable 中的上一个和下一个项目