C# 求列表平均值的最有效方法<;int>;

C# 求列表平均值的最有效方法<;int>;,c#,arrays,C#,Arrays,我为图形应用程序保留了一个滚动累加器,其中一个特性是提供样本的运行平均值 累加器的大小是可变的,但基本上最终目标是这样实现的 累加器类(丑陋但功能强大) 公共类累加器 { 私人内部修剪; 列表_点=新列表(); 列表_标签=新列表(); 列表_runAvg=新列表(); 列表_high=新列表(); 列表_low=新列表(); 公共列表点{获取{返回_点;}} 公共列表标签{获取{返回_标签;}} 公共列表runAvg{get{return\u runAvg;}} 公共列表高位{get{retu

我为图形应用程序保留了一个滚动累加器,其中一个特性是提供样本的运行平均值

累加器的大小是可变的,但基本上最终目标是这样实现的

累加器类(丑陋但功能强大)

公共类累加器
{
私人内部修剪;
列表_点=新列表();
列表_标签=新列表();
列表_runAvg=新列表();
列表_high=新列表();
列表_low=新列表();
公共列表点{获取{返回_点;}}
公共列表标签{获取{返回_标签;}}
公共列表runAvg{get{return\u runAvg;}}
公共列表高位{get{return}
公共列表低位{get{return}low;}
公共委托void onChangeHandler(累加器发送器、事件参数e);
公共事件onChangeHandler onChange;
公共蓄能器(内部微调)
{
this.trim=修剪;
}
公共空白添加(t点、字符串标签)
{
如果(_points.Count==修剪)
{
_点。移除(0);
_标签。移除(0);
_运行平均删除量(0);
_高迁移率(0);
_低移动(0);
}
_点。添加(点);
_标签。添加(标签);
if(typeof(t)=typeof(System.Int32))
{
int平均值=0;
如果(_high.Count==0)
{
_高。添加(点);
}
其他的
{
tV=(Convert.ToInt32(point)>Convert.ToInt32(_high[0])?point:_high[0];
_high.Clear();
对于(int i=0;i<_points.Count;i++)_high.Add(v);
}
如果(_low.Count==0)
{
_低。添加(点);
}
其他的
{
tV=(Convert.ToInt32(点)Convert.ToInt32(a));
}
if(typeof(t)=typeof(System.Double))
{
双平均值=0;
如果(_high.Count==0)
{
_高。添加(点);
}
其他的
{
tV=(Convert.ToDouble(point)>Convert.ToDouble(_high[0])?point:_high[0];
_high.Clear();
对于(int i=0;i<_points.Count;i++)_high.Add(v);
}
如果(_low.Count==0)
{
_低。添加(点);
}
其他的
{
tV=(Convert.ToDouble(point)Convert.ToDouble(a));
}
onchangecound();
}
私有void onchangecound()
{
if(onChange!=null)onChange(this,EventArgs.Empty);
}
}
正如您可以看到的,基本上我希望保持一个运行平均值,一个高/低标记(具有相同的数据点计数,因此它直接绑定到扩展系列类中的图表控件)

平均值是我认为最要命的,必须将列表中的每个元素添加到和/除计数中,这当然是实现平均值的方法,但循环是实现这一点的最有效方法吗

我尝试了一个lambda表达式(注释掉了),但在某种程度上它也必须这样做。(有点像使用泛型列表VS数组,我认为它必须在某处重新声明一个数组并移动元素,但它可能比我所做的更有效,所以为了方便起见,让它这样做吧)

最终目标和最后一个问题是,给定一个通用值列表

平均整个列表的最有效方法

*注意:我确实意识到输入int/floats的迂腐本质,这是因为我无法控制这个类的使用者中的类型检查,它实际上看起来是看它是否是double/int,否则我会将它全部视为floats;)


提前感谢…

保持平均水平其实很容易。你不需要每次都对整个列表求和,因为你已经有了它

获得当前平均值(从循环中)后,只需执行以下操作:

((oldAverage * oldCount) + newValue) / newCount
这将为您提供包含新值的旧集合的平均值

获取初始平均值,考虑使用LINQ:

中的<代码>平均< /代码>函数。
double average = listOfInts.Average();

保持平均水平其实很容易。你不需要每次都对整个列表求和,因为你已经有了它

获得当前平均值(从循环中)后,只需执行以下操作:

((oldAverage * oldCount) + newValue) / newCount
这将为您提供包含新值的旧集合的平均值

获取初始平均值,考虑使用LINQ:

中的<代码>平均< /代码>函数。
double average = listOfInts.Average();

哇,先生,你和咖啡是我的新好朋友,为什么我没想到呢。通过在删除之前减去删除的值,并在插入时添加新值。。。