使用Linq通过列表上的不同方法汇总内部列表
本文关键字:列表 方法 内部 Linq 使用 | 更新日期: 2024-10-20 06:59:40
我对Linq没有太多经验,很难为以下内容找到最佳方法。
我有一个项目列表,每个项目都有两个作为属性的列表。我已经发布了一个非Linq的解决方案。两个内部列表都有一个类型属性,我需要对其进行筛选。一个应该在每个项目的总数中添加一个,另一个则有一个amount属性。
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的按类型过滤的总数,就可以实现这一点。无论如何,我都会发布这个问题,因为我很好奇一次解决这个问题的最佳方法
它必须工作:
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());
一个可能的解决方案是:
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); });