1

私は次のコードを持っています - >何かのようなSelect case using LINQ- これは実際のコードではありません[インターネットから選んだ]。LINQ を使用して Select Case の概念を表示しようとしています。私のコードでは、条件に基づいて新しい List オブジェクトを作成しています

Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 };

var numberText =
(
    from n in numbers
    where n > 0
    select new
    {
        Number = n,
        Text = 
        (
            n == 1 ? "One" :
            n == 2 ? "Two" :
            n == 3 ? "Three" : "Unknown"
        )
    }
);

しかし、ここのページには「状態をポリモーフィズムに置き換える」と書かれています。

では、問題は、そのような種類の実装がコードの臭いであり、 常に厳密に回避する必要があるかどうかです。コレクションをループし、条件付きで新しいオブジェクトを作成する場合、LINQ は当然の選択のように思えます。間違っているかもしれませんか?

4

2 に答える 2

2

投稿した記事は正しいですが、その記事はクエリの例にはまったく当てはまりません。条件文には用途があります。

この例では、メソッド全体 (および場合によってはオブジェクト全体)が、オブジェクトの1 つの値に基づいてその動作を変更します (その目的を示す という名前も付けられ_typeています)。field の代わりに、_type各型を表す異なるクラスを使用できるため、そのような switch ステートメントが不要になります。

しかし、あなたの場合、それはある値から別の値への単なる変換です。
オブジェクト全体の動作は変更されません。
条件付きロジックをクエリ本体の外に移動するコンバーターを実装することを考えることができますが、それ以外の場合、コードは問題ありません。

于 2012-06-06T14:55:02.667 に答える
1

根本的な違いがあります。LINQ は、コレクションのクエリを実行できる API です (質問で示したように)。switch (またはその他の条件付き) ステートメントは、プログラム フローを制御するために使用されます。

あなたが参照しているページは、何らかの型に基づいてプログラム フローを制御する多くの条件文がある場合のコードのリファクタリングについて話しているものです。この場合、すべての条件文をポリモーフィズムに置き換えることをお勧めします。したがって、この場合、コードの匂いがあります。しかし、LINQ ステートメントで条件を使用することは問題ありません。おそらく、LINQ を構造化する方法はたくさんあります。パフォーマンスが優れているものもあれば、読み取りが優れているものもありますが、LINQ で条件を使用することがコードの匂いだとは言えません。

于 2012-06-06T14:46:23.367 に答える