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