Hier ist eine komplette, generische Implementierung von Median, die richtig leeren Sammlungen und Nullable Types behandelt. Es ist LINQ freundlich im Stil Enumerable.Average, zum Beispiel:
double? medianAge = people.Median(p => p.Age);
Diese Implementierung gibt null zurück, wenn es keine Nicht-Null-Werte in der Sammlung sind, aber wenn Sie nicht wie der Nullable-Rückgabetyp Sie könnten es einfach ändern, um stattdessen eine Ausnahme auszulösen.
public static double? Median<TColl, TValue>(
this IEnumerable<TColl> source,
Func<TColl, TValue> selector)
{
return source.Select<TColl, TValue>(selector).Median();
}
public static double? Median<T>(
this IEnumerable<T> source)
{
if(Nullable.GetUnderlyingType(typeof(T)) != null)
source = source.Where(x => x != null);
int count = source.Count();
if(count == 0)
return null;
source = source.OrderBy(n => n);
int midpoint = count/2;
if(count % 2 == 0)
return (Convert.ToDouble(source.ElementAt(midpoint - 1)) + Convert.ToDouble(source.ElementAt(midpoint)))/2.0;
else
return Convert.ToDouble(source.ElementAt(midpoint));
}
vorsichtig sein, wenn die Daten aus einer Datenbank comming, wie Linq die Daten mehr als einmal in Ihrem Fall jedoch lesen kann Linq sollte ein gutes Werkzeug sein, wie Sie scheinen Ihre Sammlung in ram zu haben. –