我定义了一个有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();

解决方案 »

  1.   

    都一样Where选不出数据,你去掉最小和最大后组成新数组,直接用LInq的 FlowArray.Average得到平均值
      

  2.   

    我原来写的是
     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;
            }
    但是这个办法会使数组的数据发生变化,即使我把先把数组赋给另外一个数组,再执行这个算法还是会改变数组数据的顺序;
      

  3.   

                double max = 0; 
                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个数据)
      

  4.   

    很好奇,是不是double result = FlowArray.Where(x => x != FlowArray.Min() && x != FlowArray.Max()).Average(); 这句报错啦。报的什么错啊。
      

  5.   

    直接用C风格的for循环带下标遍历,选出最小最大的值去掉,有问题么?
      

  6.   

    double result = FlowArray.Where(x => x != FlowArray.Min() && x != FlowArray.Max()).Average();x => x != FlowArray.Min() 这句直接就把数据全部干掉了,容器里面已经一个数据都没有了.Average()当然会报错
      

  7.   


       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);