我有这个id的列表:
string[] ids = { "AF1", "AF2", "AF3" };
我的目标是将此列表的ID与下表相交,并在单个linq查询中对年龄求和,而不进行foreach:
PersonId |Name |Age
AF1 |John |20
AF2 |Oscar |50
AF3 |Peter |30
AF4 |Abbey |65
AF5 |Adrian |43
AF6 |Barbara |15
我发现这样做:
order.Lines.Select(x => x.PersonId).Intersect(ids);
我得到了表中的所有id,但没有找到一种方法来总结年龄:/
输出必须是100
答案 0 :(得分:2)
通过使用.Select()
,您将丢弃除ID之外的所有信息,因此Age将无法访问。更好的方法是使用.Where()
和.Contains()
,然后您可以将从中返回的Age字段求和:
var sumOfAges = order.Lines.Where(x => ids.Contains(x.PersonId)).Sum(x => x.Age);
答案 1 :(得分:1)
解决方案可能如下所示:
var sum = order.Lines.Where(x => ids.Any(x.PersonId)).Sum(x=> x.Age);
答案 2 :(得分:0)
不完全是你想要的,但如果有其他人遇到这个
每个身份总和:
var ids = new string[] {"AF1", "AF2", "AF3"};
var persons = new Person[]
{
new Person("AF1", "John", 20),
new Person("AF1", "Oscar", 50),
new Person("AF2", "Peter", 30),
new Person("AF2", "Abbey", 65),
new Person("AF3", "Adrian", 43),
new Person("AF3", "Barbara", 15)
};
var groups = persons.Where(p => ids.Contains(p.PersonId)).GroupBy(p => p.PersonId);
foreach (var group in groups)
{
Console.WriteLine(group.Key + ": " + group.Sum(p => p.Age));
}