我定义了一个有12个数据的数组FlowArray,这个数组的数据是可变的。我要把数组中的最大值和最小值去掉然后取剩下10个数的平均值,代码如下,可是存在个问题,当数组中的数据都一样时,这个取平均值的算法会报错。而实际上可能出现数据都一样的情况,这个问题如何解决呢?double[] FlowArray=new double[12]{1,1,1,1,1,1,1,1,1,1,1,1};
for (int i = 1; i < FlowArray.Length ; i++)
{
FlowArray[i-1] = FlowArray[i];
}
FlowArray[FlowArray.Length - 1] = 30;
double result = FlowArray.Where(x => x != FlowArray.Min() && x != FlowArray.Max()).Average();
for (int i = 1; i < FlowArray.Length ; i++)
{
FlowArray[i-1] = FlowArray[i];
}
FlowArray[FlowArray.Length - 1] = 30;
double result = FlowArray.Where(x => x != FlowArray.Min() && x != FlowArray.Max()).Average();
解决方案 »
- 「玩一玩」Google Chrome样式进度指示器控件(圆形进度条)
- winform程序 webBrowser控件中 按钮的提交?
- --数据结构(C#版)--我走遍广州了还是找不到,帮手...
- 在ADO.NET中,如何得当前数据库的所有的TABLE
- 正则表达式~~ (用在SQL语句中的)谢谢大家了
- 关于Average()与lambda 表达式
- sql更新的时候老是出错的原因是什么
- 高分求条码打印控件
- 想学c#,可不知道如何下手,请各位出出点子,大家刚开始是怎么学的?
- vc++中对应于多媒体有Mmsystem.h include Windows.h,那么在c#中呢?
- WCF如何获取客户端在线的数量
- vs2010版水晶报表的调用问题。
public double FilterAlgorithm(ref double[] FilterArray, double max, double min)
{
double filter = 0;
double sum = 0; //对数组进行排序
for (int i = 0; i < FilterArray.Length; i++)
{
for (int j = i; j < FilterArray.Length; j++)
{
if (FilterArray[i] < FilterArray[j])
{
double temp = FilterArray[i];
FilterArray[i] = FilterArray[j];
FilterArray[j] = temp;
}
}
}
max = FilterArray[FilterArray.Length - 1];
min = FilterArray[0];
//除去最大值和最小值求其平均值
for (int i = 1; i < FilterArray.Length - 1; i++)
{
sum += FilterArray[i];
}
filter = sum / (FilterArray.Length - 2);
return filter;
}
但是这个办法会使数组的数据发生变化,即使我把先把数组赋给另外一个数组,再执行这个算法还是会改变数组数据的顺序;
double min = 1000;
double sum = 0;;
for(int j = 0; j < FlowArray.Length ; j++)
{
if (max < FlowArray[j]) max = FlowArray[j];
if (min > FlowArray[j]) min = FlowArray[j];
sum = sum + FlowArray[j];
}
double aver = (sum - max - min) / (10);
最后我想到了这个办法,测试了一下是可以的,不知道还有没有更好的办法。我觉得这个办法效率比较低;(数组一共12个数据)
double[] FlowArray = new double[12] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
for (int i = 1; i < FlowArray.Length; i++)
{
FlowArray[i - 1] = FlowArray[i];
}
FlowArray[FlowArray.Length - 1] = 30;
var result = FlowArray.OrderBy(x => x).Where((x, i) => i > 0 && i < FlowArray.Length-1).Average(); Console.WriteLine(result);