假设我在“员工”集合中有几个人:
Name | Position | Age
------+----------+----
Tom | Manager | 35
Hank | Driver | 38
Harry | Driver | 45
... | ... | ...
Mark | Driver | 30
----------------------
,如果他们中至少有40岁以上的车手,我想得到所有车手。 您能帮我完成我的LINQ吗?
UPD。我想使用单个LINQ来完成此任务,而性能无关紧要。所以决定
var allDrivers = Employees.Where(n => n.Position == "Driver").ToList();
return allDrivers.Any(n => n.Age > 40)
? allDrivers
: new List<Employee>();
很好,但是我不能将其标记为答案。
在这种情况下,我需要得到汉克,哈里和马克。因为他们都是车手,而哈利才45岁(> 40)。但是,如果哈里39岁,我将一无所获,因为在这种情况下,所有车手都不到40岁。
答案 0 :(得分:3)
因此,如果我要解析“从字面上看,如果其中至少有一个年龄在40岁以上的司机,我想得到所有司机”
var allDrivers = Employees.Where(n => n.Position == "Driver").ToList();
return allDrivers.Any(n => n.Age > 40)
? allDrivers
: new List<Employee>();
或类似的东西。
对于一次查询的功能疯狂:
(int maxAge, List<Employee> result) = Employees
.Aggregate(
(age: 0, list: new List<Employee>()),
(al, n) => n.Position == "Driver"
? (Math.Max(al.age, n.Age), al.list.Concat(new [] {n}).ToList()
: al));
return maxAge > 40 ? result : new List<Employee>();
这只是您可以设置的PoC。但是请记住-在问自己是否可以的时候,不要忘记问自己是否应该:)
答案 1 :(得分:1)
如果您真的希望在一个声明中使用它(对我来说这是非常虚假的),则可以执行以下操作:
IEnumerable<Employee> result =
employees.GroupBy(n => n.Position)
.Where(g => g.Key == "Driver" && g.Max(x => x.Age) > 40)
.FirstOrDefault();
别忘了做
return result ?? Enumerable.Empty<Employee>();
如果您什么都没发现,则要返回空结果而不是null。