我对Linq没有太多经验,我在制定以下最佳方法时遇到了麻烦。
我有一个项目列表,每个项目都有2个列表作为属性。我已经发布了一个非Linq解决方案,用于我正在尝试做的事情。两个内部列表都有我需要过滤的类型属性。一个应该在每个项目的总数中加一个,而另一个则有一个数量的属性。
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尽可能干净地完成此操作?
答案 0 :(得分:1)
必须有效:
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 :(得分:0)
可能的解决方案是:
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); });