获得列表的“运行平均值”

时间:2015-01-04 21:32:02

标签: c# list

说我有一个清单:

List<int> numbers = new List<int>();

我试图获得&#34;平均值&#34;它的。 (对不起,我真的不知道怎么称呼它。)

例如:

此列表中的第一项是55的平均值为5,因此第一个平均值为5

此列表中的第二项是75 and 7的平均值为6,因此第二项平均值为6

此列表中的第三项是105, 7 and 10的平均值为7.3,因此第三项平均值为7.3 等等。

那些第一次平均值,第二次平均值等是我试图获得的平均值。我该怎么做呢?我一直在网上搜索,但说实话,我不太清楚我应该寻找什么。 :(

4 个答案:

答案 0 :(得分:5)

试试这个:

 string st = Console.ReadLine();
 string[] strs = st.Split(' ');
 List<int> numbers = new List<int>();
 List<double> averages = new List<double>();
 for (int i = 0; i < strs.Length; i++)
 {
     numbers.Add(int.Parse(strs[i]));
     averages.Add(numbers.Average());
 }

这将读取标准输入中的数字,数字在输入中用空格分隔。

答案 1 :(得分:4)

您可以尝试这样的事情:

var averages = Enumerable.Range(1, numbers.Count)
               .Select(x => numbers.Take(x).Average())
               .ToList();

这将生成从1numbers.Count的序列。然后使用Take,每次都会获得X元素(您可以将X视为索引,唯一的区别是它从1开始并逐渐增加到numbers.Count average)从第一个元素开始,然后获取{{1}}。将它们放入列表中。

答案 2 :(得分:2)

列表

    List<int> numbers = new List<int>();
    List<double> averages = new List<double>();

测试数据

    numbers.AddRange(new int[]{5, 7, 10});

    // get average of current List
    averages.Add(numbers.Average());

这样的平均值列表本身通常并不意味着没有其他数据,如元素数量,持续时间或某些限定条件。

当移动平均值不是一对一的值时,此方法更适合。例如,应用程序存储值。然后定期说,每分钟一次,计算并存储平均值。

答案 3 :(得分:0)

您需要“运行平均值”,而不是我假设的所有项目从一开始的平均值?

运行平均值需要一个数字来表示向后看多远,一个数字来表示向前看多远。

这将为您提供运行平均值:

public List<double> GetRunningAverage(List<double> SourceList, int ItemsBefore, int ItemsAfter)
{
    List<double> TargetList = new List<double>() { };

    // Only makes sense if the list is > 1 of course
    if (SourceList.Count > 1)
    {
        for (int i = 0; i < SourceList.Count; i++)
        {
            int LookBack =
                (ItemsBefore > i ? i : ItemsBefore);
            int LookForward =
                (ItemsAfter < SourceList.Count - i
                ? ItemsAfter : SourceList.Count - i);

            TargetList.Add(SourceList.GetRange(i - LookBack, LookBack + LookForward).Average());
        }
    }
    else
    {
        TargetList.AddRange(SourceList);
    }

    return TargetList;
}

然后你可以像这样使用它:

    List<double> FullList = GetRunningAverage(
    new List<double>() { 100, 5, 5, 6, 23, 10, 56, 32, 54, 1, 3, 85, 65, 49, 22, 65, 32, 5, 2, 4, 5, 89, 110, 55, 6, 56, 57 },
    3,  // Looking back 3 items
    3); // Looking forward 3 items