我需要从 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();
结果
查找是什么样的?因为它为我们做了繁重的工作。
关于c# - 有没有办法将这两个 LINQ 语句合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32875697/