Hier ist eine vollständige, generische Implementierung von Median, die leere Sammlungen und nullable Typen richtig behandelt. Sie ist LINQ-freundlich, zum Beispiel im Stil von Enumerable.Average:
double? medianAge = people.Median(p => p.Age);
Diese Implementierung gibt null zurück, wenn es keine Werte in der Sammlung gibt, die nicht null sind, aber wenn Sie den Rückgabetyp nullable nicht mögen, können Sie ihn leicht ändern, um stattdessen eine Ausnahme zu erzeugen.
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));
}
1 Stimmen
Seien Sie vorsichtig, wenn die Daten aus einer Datenbank kommen, wie Linq die Daten mehr als einmal lesen kann, jedoch in Ihrem Fall Linq sollte ein gutes Werkzeug sein, wie Sie scheinen, um Ihre Sammlung in ram haben.