对C#中对象的不同实例的数组进行优雅的平均

本文关键字:数组 实例 对象 | 更新日期: 2023-09-27 18:01:48

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

输入对象如下所示:

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实现。有什么建议吗?

对C#中对象的不同实例的数组进行优雅的平均

float[] result = inputList.Select(c => c.DataValues)
                          .Transpose()
                          .Select(r => r.Average())
                          .ToArray();

从这里使用CCD_ 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

这个怎么样?

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数组中的每个索引计算一个结果。