3

私は次のステートメントを使用しています。

IEnumerable<Stuff> output = list.Entities.Select(
  element => new Stuff(element));

要素を含める必要がない場合もあるので、条件付きを追加しました。

IEnumerable<Stuff> output = list.Entities.Where(
  element => IsDecent(element)).Select(
    element => new Stuff(element));

さて、チェッカーをスキップして、新しいStuffを作成してnadaを生成する(nullを返すか、何も返さない)ので、下品な要素の追加を省略したほうがいいかもしれないと思いました。または、このような条件が満たされたときに、デストラクタを自動的に呼び出すこともできます。もちろん、チェックは他の場所、つまりStuffのコンストラクターで実行する必要があります。

  1. 出来ますか?
  2. お勧めですか?
  3. 広く適用されていますか?
4

6 に答える 6

4

現在使用しているコードを使用する必要があります。AWhereとaSelectは、使いやすさの観点からははるかに優れており、そもそもそこにあるべきではないときに、Selectアイテムを(または他の「実際のアイテムではない」プレースホルダー)にマップすることがあります。nullこれらのnullアイテムを削除するか、無視する必要があります。

あなたは2つのことをしています。アイテムを条件を満たすアイテムにフィルタリングし、各アイテムを別のタイプのアイテムにマッピングします。コードは、これら2つのことを実行しているという事実を反映している必要があります。

于 2013-01-14T19:14:52.653 に答える
1

いいえ、new から構築されたオブジェクト以外を返すことはできません。コンストラクターからスローして、特定のオブジェクトの作成をブロックできますが、そのような例外を処理する必要があります。

作成中にオブジェクトの構築/破棄をブロックしようとすることはお勧めしません。通常、オブジェクトの構築は成功することが期待されます。他の回答で提案されているようにコンストラクターを呼び出さないことは、はるかにクリーンなアプローチです。

于 2013-01-14T19:19:15.547 に答える
0
  1. はい。
  2. いいえ(いくつかの非常に特別な状況によっては、それが最善のアプローチかもしれません)。
  3. 見たことがない。しかし、クールな考え。
于 2013-01-14T19:18:55.890 に答える
0

出来ますか?

はい 可能です。ただし、条件の検証が必要です (Where 句は Select 句に移行します)。

おすすめですか?

推奨も非推奨もできません。しかし、コード レビューの観点から見ると、バグがあり危険なように見えます。

広く適用されていますか?

広く適用されているのは見られません。Null オブジェクト パターンの方がよく知られています。

于 2013-01-14T19:17:12.740 に答える
0

new Nullable<int>()あなたが尋ねるので、それが返されることを観察してくださいnull

しかし、Servy が言ったことを繰り返したいと思います - あなたの現在のコードは問題ありません。過度に複雑にしないでください。

于 2013-01-14T19:59:36.353 に答える
-1

あなたが持っているものがおそらく最高だと思います。しかし、それらを組み合わせることに設定されている場合は、次のような拡張メソッドを使用できます。

static class Extensions {
    public static IEnumerable<U> SelectWhere<T, U>(
                    this IEnumerable<T> @this, 
                    Predicate<T> filter, 
                    Func<T, U> map) 
    {
        foreach (T element in @this) {
            if (filter(element)) yield return map(element);
        }
    }
}

次のように使用します。

list.Entities.SelectWhere(IsDecent, element => new Stuff(element))
于 2013-01-14T19:20:22.893 に答える