2014-09-12 82 views
-3

我有一个整数列表,即删除项目:用价值超过平均

List<int> test = new List<int>() { 
    5, 5, 4, 0, 1, 23456732, 4, 3, 2, 4, 3 
}; 

我想计算列表中的整数的平均水平,但没有考虑到任何异常值(如一个在中间)。我可以使用List对象中的任何方法吗?什么是最好的方法来处理它?

+5

你怎么定义'abnormal'? – Zbigniew 2014-09-12 15:13:26

+0

你可能想要的是平均值,而不是平均值。 – ths 2014-09-12 15:14:33

+0

是什么让23456732“异常”? – batwad 2014-09-12 15:15:41

回答

2

使用LINQ:

var average = test.Average(); 

如果您想要排除某些值,那么你需要对其进行过滤:

// average of numbers less than 100 
var average = test.Where(i => i < 100).Average(); 

您可以定义自己的函数,它会检查给定数量是否正常:

var average = test.Where(i => IsNormal(i)).Average(); 
// method 
bool IsNormal(int number) 
{ 
    // your logic here 
    return true;// or false 
} 
+3

或'test.Where(i => IsNormal(i))。Average();'让IsNormal给定义:) – 2014-09-12 15:18:37

+0

@GrzegorzSławecki:lol – 2014-09-12 15:19:30

+0

Good call @GrzegorzSławecki,将其添加到我的答案中,我们将剩下的给Bartosz。谢谢! – Zbigniew 2014-09-12 15:19:53

0

你可以先只计算median然后我们对于(在本例中10)仅仅是一个给定的因素从median远离计算Ë值:

public double GetResult(List<int> values) 
{ 
    int median = Median(values); 
    return values.Where(x => Math.Abs(x - median) < 10 * median).Average(); 
} 

public static int Median(IEnumerable<int> list) 
{ 
    List<int> orderedList = list 
     .OrderBy(numbers => numbers) 
     .ToList(); 

    int listSize = orderedList.Count; 
    int result; 

    if (listSize % 2 == 0) // even 
    { 
     int midIndex = listSize/2; 
     result = ((orderedList.ElementAt(midIndex - 1) + 
       orderedList.ElementAt(midIndex))/2); 
    } 
    else // odd 
    { 
     double element = (double)listSize/2; 
     element = Math.Round(element, MidpointRounding.AwayFromZero); 

     result = orderedList.ElementAt((int)(element - 1)); 
    } 

    return result; 
} 

从这个页面采取位数算出:http://www.remondo.net/calculate-mean-median-mode-averages-csharp/