代码之家  ›  专栏  ›  技术社区  ›  Amittai Shapira

使用LINQ查找包含多个集合的平均值的集合

  •  1
  • Amittai Shapira  · 技术社区  · 15 年前

    简单的(我还没猜到)LINQ:我有一个数组列表,我想得到一个包含每个列平均值的集合。类似于:

    var myCollection = new List<double[]>();
    myCollection.Add(new []{1,2,3,4,5});
    myCollection.Add(new []{3,4,5,6,7});
    // Your answer -->     {2,3,4,5,6}
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Marc Gravell    15 年前

    像这样?

    var myCollection = new List<double[]>();
    myCollection.Add(new double[]{1,2,3,4,5});
    myCollection.Add(new double[]{3,4,5,6,7});
    
    var qry = (from col in Enumerable.Range(0, myCollection.Min(arr => arr.Length))
               select myCollection.Average(arr => arr[col])).ToList();
    

    怎么样(注意-你可能需要倒车 col row 根据您选择的数据定向方式):

    int[,] data = {{0,1,2},{3,4,5}};
    var qry = (from col in Enumerable.Range(0, data.GetLength(0))
               select new {
                  col, avg = Enumerable.Range(0, data.GetLength(1))
                             .Select(row => data[col, row]).Average()
               }).ToList();
    
    foreach(var result in qry) {
        Console.WriteLine("{0}: {1}", result.col, result.avg);
    }
    

    或者如果你只想要平均值(不是anon类型):

    var qry = (from col in Enumerable.Range(0, data.GetLength(0))
               select Enumerable.Range(0, data.GetLength(1))
                   .Select(row => data[col, row]).Average()).ToList();
    
        2
  •  1
  •   Cheng Chen    15 年前

    既然你修改了问题,把二维数组改成 List<double[]>

    var result = myCollection.Aggregate((arr1, arr2) => arr1.Zip(arr2, (x, y) => (x + y) / 2).ToArray())