gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:24:23 25 4
gpt4 key购买 nike

我需要从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com