計測・制御・データ処理のトータルソリューションで、お客様の問題解決提案を行います。


インフォテック開発者のつぶやき: C#の拡張メソッドがおもしろい。2


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


2012/08/06

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

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

投稿者:匿名 | 投稿時間:2012/08/06 14:31

コメントを投稿

Blogger

HOME 会社案内 事業内容 PC開発事例 FA開発事例 ソリューション開発事例 製品情報 ブログ 求人情報 サイトについて サイトマップ 地図(別窓) お問い合わせ

最近の投稿


過去の投稿





▲ページの先頭へ