【问题标题】:Elegant averaging of arrays from different instances of an object in C#C#中对象的不同实例的数组的优雅平均
【发布时间】:2011-10-03 21:22:05
【问题描述】:

我有一个相同类型的对象列表,每个对象都有一个浮点数组的属性。将此列表作为输入,返回一个新数组的最简单方法是什么?该数组是列表中数组的平均值?

输入对象如下所示:

Class MyDatas
{
    float [] DataValues;
}

...

List<MyDatas> InputList;
float [] result;

DataValues 数组将保证具有相同的长度。结果数组的每个元素将是列表中每个成员的数组中相应元素的平均值。例如:result[0] = (InputList[0].DataValues[0] + InputList[1].DataValues[0] + ... ) / InputList.Count

当然,我可以在 for 循环中使用 foreach 强制执行此操作,然后再使用另一个 for 循环,但在我看来,这应该可以通过一两行 LINQ 来实现。有什么建议吗?

【问题讨论】:

  • Sum可以取出一个for循环,所以只剩下1个:for (int i = 0; i

标签: c# .net arrays linq list


【解决方案1】:
float[] result = inputList.Select(c => c.DataValues)
                          .Transpose()
                          .Select(r => r.Average())
                          .ToArray();

使用来自hereTranspose

【讨论】:

  • 为什么要强制转换为 IEnumerable?数组实现 IEnumerable.
【解决方案2】:

纯 LINQ:

var result = InputList
    .SelectMany(x => x.DataValues.Select((y, i) => new { y, i }))
    .GroupBy(a => a.i, b => b.y, (k, v) => v.Average());

示例:

List<MyDatas> InputList = new List<MyDatas>();
InputList.Add(new MyDatas { DataValues = new float[] { 1, 2, 3 } });
InputList.Add(new MyDatas { DataValues = new float[] { 4, 5, 6 } });
InputList.Add(new MyDatas { DataValues = new float[] { 7, 8, 9 } });

var result = InputList
    .SelectMany(x => x.DataValues.Select((y, i) => new { y, i }))
    .GroupBy(a => a.i, b => b.y, (k, v) => v.Average());


foreach (var item in result)
{
    Console.WriteLine(item);
}

输出:

4
5
6

【讨论】:

    【解决方案3】:

    这个怎么样?

    var averages = (from index in Enumerable.Range(0, InputList[0].DataValues.Length)
                    select (from item in InputList
                            select item.DataValues[index]).Average()).ToArray();
    

    或者,使用流畅的语法:

    var averages = Enumerable.Range(0, InputList[0].DataValues.Length)
                   .Select(index => InputList.Average(item => item.DataValues[index]))
                   .ToArray();
    

    它清楚地表明您真正在做的是为 DataValues 数组中的每个 index 计算一个结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多