えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

Linqはすごい? その3

Linqはすごいと信じ込まされているあなた以下のプログラムを見てください。

あなたが自分でプログラムを書くとして cal2 と cal3 + Extensionクラス のどちらを書きますか?

 

過去のシリーズ

Linqはすごい? その2

Linqはすごい? その1

 

    static int[] cal2(int[] arr)

    {

        int sum = 0;

        int count = 0;

        int max = int.MinValue;

        int min = int.MaxValue;

        foreach (int a in arr)

        {

            sum += a;

            count++;

            if (max < a) max = a;

            if (min > a) min = a;

        }

        return new int[] { sum, count, max, min };

    }

    static int[] cal3(int[] arr)

    {

        return new int[] {

            arr.ExSum(),

            arr.ExCount(),

            arr.ExMax(),

            arr.ExMin()

        };

    }

 

public static class Extension

{

    public static int ExSum(this IEnumerable<int> source)

    {

        if (source == null) throw new ArgumentNullException("source");

        int sum = 0;

        foreach (int value in source) sum += value;

        return sum;

    }

    public static int ExCount(this IEnumerable<int> source)

    {

        if (source == null) throw new ArgumentNullException("source");

        int count = 0;

        foreach (int value in source) count ++;

        return count;

    }

    public static int ExMax(this IEnumerable<int> source)

    {

        if (source == null) throw new ArgumentNullException("source");

        int max = 0;

        bool flag = false;

        foreach (int value in source)

        {

            if (flag)

            {

                if (value > max) max = value;

            }

            else

            {

                max = value;

                flag = true;

            }

        }

        if (!flag) throw new InvalidOperationException("NoElements");

        return max;

    }

    public static int ExMin(this IEnumerable<int> source)

    {

        if (source == null) throw new ArgumentNullException("source");

        int min = 0;

        bool flag = false;

        foreach (int value in source)

        {

            if (flag)

            {

                if (value < min) min = value;

            }

            else

            {

                min = value;

                flag = true;

            }

        }

        if (!flag) throw new InvalidOperationException("NoElements");

        return min;

    }

}

#throw に new を入れ忘れていました。
#元コードから手で修正した部分です。
#指摘ありがとうございました。

投稿日時 : 2008年1月25日 15:15

コメントを追加

# re: Linqはすごい? その3 2008/01/25 15:23 シャノン

どこにもLINQコードが出てきてませんが。
# 言わんとすることは察してます。たぶん。

# re: Linqはすごい? その3 2008/01/25 16:00 nsharp

効率云々の理由ではなくて、わざわざ車輪の再発明をして自分でメンテする責任を負うのがあまりにもアフォらしいという理由で、cal2。(;´Д`)

# re: Linqはすごい? その3 2008/01/25 16:11 えムナウ

>nsharp さん
Extension が FrameWork に入っていてコーディングしなくて済むなら cal3 ですね。
「Linqはすごい? その2」の cal3 のパターンです。

# re: Linqはすごい? その3 2008/01/25 16:14 774RR

cal3 はどうみても min と max が正しく求まらない気がするので cal2

# re: Linqはすごい? その3 2008/01/25 16:17 えムナウ

>cal3 はどうみても min と max が正しく求まらない気がする
あれバグありますか?

# re: Linqはすごい? その3 2008/01/25 18:43 石野

ぜんぜんLinqじゃないけど

ExMaxとExMinのコードは、例外を前にまとめて
NoElementsを先に調べておいて

初期値にsource[0]を突っ込んで、[0]を含めて
foreachで回ればいいんじゃないですか?

あと、continueを使う意味ってあります?
elseを入れてあげればいいような気がしますが・・・

個人的には不思議系ソースに見えます。

# re: Linqはすごい? その3 2008/01/25 20:24 siokoshou

nsharp さんと一緒で再発明しないで部品を使います。

# このコードなにかに抵触するような気がしますが大丈夫なんでしょうか…

# re: Linqはすごい? その3 2008/01/25 20:40 えムナウ

>このコードなにかに抵触するような気がします
しませんよ。
私の作ったコードですから。

# re: Linqはすごい? その3 2008/01/25 21:08 えムナウ

石野さん
>NoElementsを先に調べておいて
>あと、continueを使う意味ってあります?
>elseを入れてあげればいいような気がしますが・・・
そうですね。
気にしなさすぎですね。

# re: Linqはすごい? その3 2008/01/25 21:20 えムナウ

>あと、continueを使う意味ってあります?
>elseを入れてあげればいいような気がしますが・・・
こっちは修正しておきました。

# re: Linqはすごい? その3 2008/01/25 21:44 NyaRuRu

「以下のコードが cal2 と同じアルゴリズムで計算されるような Extension Method: ConcurrentReduce を作れ」というお題とか面白いかな.
確かにそこそこ便利かも.

var arr = default(int[]);
arr = ...

var ret = arr.ConcurrentReduce( seq => new
        {
          Sum = seq.Sum(),
          Count = seq.Count(),
          Max = seq.Max(),
          Min = seq.Min()
        }
      );

# re: Linqはすごい? その3 2008/01/27 8:41 えムナウ

nsharpさんがforeach一回で可能なサンプルを「その2」でつくってくれました。

# re: Linqはすごい? その3 2008/01/27 10:34 NyaRuRu

>nsharpさんがforeach一回で可能なサンプルを「その2」でつくってくれました。

拝見してますよ.毎度ながら大変参考になりました.
ちなみに私のお題は,上のようなシンタックスから nsharp センセが書かれたようなコードに実行時自動変換する拡張メソッドを作ってみようというものです.

タイトル
名前
URL
コメント