使用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的按类型过滤的总数,就可以实现这一点。无论如何,我都会发布这个问题,因为我很好奇一次解决这个问题的最佳方法

使用Linq通过列表上的不同方法汇总内部列表

它必须工作:

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