关于c#:使用Linq在列表中按不同方法汇总内部列表

Totalling inner lists by different methods on a list using Linq

我对Linq的经验不太丰富,而且我很难为下面的问题找到最好的解决方法。

我有一个项目列表,每个项目都有两个列表作为属性。我已经发布了一个非LINQ解决方案来解决我要做的事情。两个内部列表都有一个我需要筛选的类型属性。一个应该在每个项目的合计中添加一个,另一个则具有amount属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
IEnumerable<Foo> foos = /*a list of foo*/;
Dictionary<Foo, int> totals = new Dictionary<Foo, int>();
foreach (Foo foo in foos)
{
    int total = 0;
    foreach(Bar1 bar in foo.Bar1)
    {
        if (bar.Type == selectedBarType)
        {
            total += bar.Amount;
        }
    }
    foreach(Bar2 bar in foo.Bar2)
    {
        if (bar.Type == selectedBarType)
        {
            total++;
        }
    }
    totals[foo] = total;
}

如何使用LINQ尽可能干净地完成这项工作?

  • 编辑前:我想我可以向foo添加一个方法,该方法只公开每个foo的按类型过滤的总数,从而使其变得微不足道。不管怎样,我都会把这个问题贴出来,因为我很好奇如何用最好的方法来解决这个问题。


它必须工作:

1
2
3
4
5
6
 Dictionary<Foo, int> totals = foos.ToDictionary(x => x,
          y => y.Select(z => new  
          {
              Sum1 = z.Bar1.Where(d => d.Type == selectedBarType).Sum(d => d.Amount),
              Sum2 = z.Bar2.Where(d => d.Type == selectedBarType).Sum(d => d.Amount)
          }).Sum());


可能的解决方案是:

1
2
3
var totals =             foos.ToDictionary(f => f, f => { return
              f.Bar1.Where(b1 => b1.Type == selectedBarType).Sum(b1 => b1.Amount)
            + f.Bar2.Count(b2 => b2.Type == selectedBarType); });