【问题标题】:Getting an Average over Multiple Collections in LINQ在 LINQ 中获取多个集合的平均值
【发布时间】:2008-11-25 19:19:36
【问题描述】:

我有一个集合集合,所有子集合都有相同数量的元素。父集合除了保存子集合之外什么都不做。

[0] [Child_0] [ID: 1]
[0] [Child_0] [Amount: 4]
[0] [Child_1] [ID: 2]
[0] [Child_1] [Amount: 7]
[1] [Child_0] [ID: 1]
[1] [Child_0] [Amount: 2]
[1] [Child_1] [ID: 2]
[1] [Child_1] [Amount: 4]
[2] [Child_0] [ID: 1]
[2] [Child_0] [Amount: 5]
[2] [Child_1] [ID: 2]
[2] [Child_1] [Amount: 3]

对于我的输出,我不关心父集合。我只想要一个匿名类型的 ID 和平均金额,所以对于上述情况,它会是

ID     Avg
1      3.66
2      4.66

回复的语言无关紧要。

谢谢。

【问题讨论】:

    标签: c# vb.net linq


    【解决方案1】:

    听起来像一个简单的 selectmany,group 和 average 应该可以完成这项工作;这里我使用匿名类型和数组纯粹是为了方便输入...

            // the data
            var outer = new[] {
                new[] {
                    new {ID=1,Amount=4}, // [0] [Child_0] [ID: 1, Amount: 4]
                    new {ID=2,Amount=7}  // [0] [Child_1] [ID: 2, Amount: 7]
                },
                new[] {
                    new {ID=1, Amount=2}, // [1] [Child_0] [ID: 1, Amount: 2]
                    new {ID=2, Amount=4}  // [1] [Child_1] [ID: 2, Amount: 4]
                },
                new[] {
                    new {ID=1, Amount=5}, // [2] [Child_0] [ID: 1, Amount: 5]
                    new {ID=2, Amount=3}  // [2] [Child_1] [ID: 2, Amount: 3]
                }
            };
            var qry = from x in outer
                      from y in x
                      group y by y.ID into grp
                      select new { Id = grp.Key, Avg = grp.Average(z => z.Amount) };
    
            foreach (var item in qry)
            {
                Console.WriteLine("{0}: {1}", item.Id, item.Avg);
            }
    

    【讨论】:

      【解决方案2】:

      您可以以此为指导

              var items = new[] 
              { 
                  new { ID = 1, Amount = 4 }, 
                  new { ID = 1, Amount = 5 },
                  new { ID = 2, Amount = 5 },
                  new { ID = 2, Amount = 3 },
              };
      
              var results = from item in items group item by item.ID into g select new { ID = g.Key, Avg = g.Average(item => item.Amount) };
      
              foreach (var result in results)
              {
                  Console.WriteLine("{0} - {1}", result.ID, result.Avg);
              }
      

      【讨论】:

      • 比我的回答好多了。 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2014-09-23
      相关资源
      最近更新 更多