2014-09-12 143 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/