C#の拡張メソッドがおもしろい。2

中央値(メディアン)を計算する拡張メソッドを作成しました。

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拡張メソッドはどのような実装になっているのでしょう?
調べてみると、型ごとに拡張メソッドが用意されていました。なるほど。

コメントを残す