与Linq的Intersect和Sum列表

时间:2018-01-15 12:16:35

标签: c# linq

我有这个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

3 个答案:

答案 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));
}