使用Linq在列表上通过不同方法合计内部列表

时间:2015-03-05 09:24:39

标签: c# linq

我对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尽可能干净地完成此操作?


  • 帖子后编辑: 我想我可以为foo添加一个方法,它只是为每个Foo公开了按类型过滤的总数,这使得这很简单。无论如何,我会发布这个问题,因为我很好奇在一个方面解决这个问题的最佳方法。

2 个答案:

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