中央値(メディアン)を計算する拡張メソッドを作成しました。
public static T Median<T>(this IList<T> items) {
//要素数チェック
if (items == null || items.Count <= 0) return default(T);
//ソート
List<T> sortedItems = new List<T>(items);
sortedItems.Sort();
//奇数、偶数による分岐
if (sortedItems.Count.IsOdd()) {
return sortedItems[sortedItems.Count / 2];
} else {
decimal item1 = Convert.ToDecimal(sortedItems[sortedItems.Count / 2 - 1]);
decimal item2 = Convert.ToDecimal(sortedItems[sortedItems.Count / 2]);
decimal center = (item1 + item2) / 2;
return (T)Convert.ChangeType(center, typeof(T));
}
}
要素数が奇数の場合は、そのまま中央値を返すので問題無いが、偶数の場合は、中央値2つの平均値を返したいので、一旦decimal型に変換して平均値を計算しています。
しかしこの実装ではdouble型の大きい値の場合にオーバーフローしたり、NaNに対応出来ません。
.netフレームワークのAverage拡張メソッドはどのような実装になっているのでしょう?
調べてみると、型ごとに拡張メソッドが用意されていました。なるほど。