数组中每 20 个数字的平均值

Mid*_*ght 0 c# arrays loops average

我有一个大数组(+400 个数字)decimal[] Raw,我需要对每 20 个数字求平均值,将这些数字发送到一个新数组或 list RawAvgList,然后形成一个新数组或 list 以获得 中数字的平均值RawAvgList。又名我的代码应该找到前 20 个数字的平均值并将它们存储在我的新数组/列表中,然后是下一个 20 个,然后是下一个 20 个。如果大数末尾的数字多于或少于 20 个,它也应该用于计数大批

我的 while 循环应该在另一个重新启动计数索引的循环中吗?我应该每 20 个数字就删除一次吗?我知道只是简单地使用Average()ondecimal[] Raw是一种选择,但数字需要比该函数给出的更准确。我也尝试过使用IndexRange,但是当数字不能被我的计数(20)整除时,它会给出错误,这将会发生。

我已经被难住了这么久,我已经无计可施,沮丧得难以置信,有什么可以帮助的。

int unitof = 20;

decimal[] Raw = new decimal[] { Decimal.Parse(line.Substring(9).ToString(), style1) };

for (int i = 0; i < Raw.Length; i++)
{ 
    while (count < Raw.Count()) 
    {
        RawAvgList.Add(// ** Average of every 20 numbers **//);
        count += unitof; // 20 by 20 counter
    }

   // Reset counter or add another counter?? 
}

Run Code Online (Sandbox Code Playgroud)

编辑(2022 年 8 月 22 日)

我按照建议添加了 IEnumerable<IEnumerable> 块,但我相信其他地方出了问题,或者我没有完全理解它是如何工作的,因为我从未使用过块。

我实现了块

public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> values, int chunkSize)
{
    return values
    .Select((v, i) => new { v, groupIndex = i / chunkSize })
                .GroupBy(x => x.groupIndex)
                .Select(g => g.Select(x => x.v));
}
Run Code Online (Sandbox Code Playgroud)

添加了您的建议

var rawAvgList = Raw.Chunk(20).Select(chunk => chunk.Average()).ToArray();
var result = rawAvgList.Average();
Run Code Online (Sandbox Code Playgroud)

然后尝试打印到 Console.Writeline()

Console.WriteLine($"{result} \t " + LengthRaw++);
Run Code Online (Sandbox Code Playgroud)

这让我和输出

36.41    0
37.94    1
38.35    2
37.63    3
36.41    4
36.41    5
36.21    6
36.82    7
37.43    8
37.43    9
37.43    10
37.43    11
37.43    12
37.94    13
37.94    14
37.84    15
37.43    16
37.84    17
37.43    18
37.84    19
37.84    20
Run Code Online (Sandbox Code Playgroud)

当输出应该是(我目前只使用 21 个数字,但稍后会更多)

37.37    0 
37.84    1
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 5

您可以Enumerable.Chunk()将数据分成最多 20 个批次,然后对所有这些块进行平均:

decimal[] raw = new decimal[10000]; // Fill with your data.,

var rawAvgList = raw.Chunk(20).Select(chunk => chunk.Average()).ToArray();
var result = rawAvgList.Average();
Run Code Online (Sandbox Code Playgroud)

不过我不知道你的意思

如果大数组末尾的数字多于或少于 20 个,它也应该用于计数

如果输入的长度不是 20 个项目的倍数,那么最后一个被平均的块的长度将小于 20,但所有其他块的长度将恰好是 20。