19

可能な重複:

LINQで.Firstを使用する場合と.FirstOrDefaultを使用する場合

使用のポイントは何ですかFirstLINQの中の演算子FirstOrDefault代わりに演算子?

var q = results.First(); // Error if empty


  • 重複している可能性がありますが、「建設的ではない」とします。 :(しかし、私は質問がについての説明を使用することができると思いますなぜ First(Error-if-emptyがある場合)はより理想的ではないと考えられていますFirstOrDefault。 - user166390

3 답변


17

特定の質問に直接回答するにはFirstいつでも使えるならFirstOrDefault)、使用できない場合がありますFirstOrDefault情報が失われるからです。 「デフォルト値」は、おそらくソースリスト内の有効な要素タイプです。列挙型の最初の要素がnull / defaultであることと、リストに要素がないこととを区別することはできません。Firstまたは最初にあるかどうか確認するAny要素。二重列挙が必要です。

これは、次のような値型列挙型に特に当てはまります。int[]default(int)です0これも配列の有効な値です。

一般に、2つの方法は異なる論理フローを表します。First要素を持たないことが「例外的」(エラー)である場合に使用されます。その場合は、アプリケーションで帯域外を処理します。このシナリオでは、少なくとも1つの要素があると期待しています。FirstOrDefault空のセットではnullを返します。つまり、戻り値を使って追加の処理を行う必要があります。これはParsevsTryParseメソッドオンint/double/等。実際、あなたの質問はある意味ではなぜ例外を使用するのかというより一般的な質問につながります。

からFirst例外をスローすると、例外が提供するすべてのコード再利用の機会に役立ちます。たとえば、次のようにします。

try
{
    x = arr1.First();
    y = arr2.First();
    z = arr3.First();
}
catch
{
    throw new ArgumentException();
}


8

明示的に例外の発生を強制するnullチェック。


2

それはと同じ議論ですInt32.ParseInt32.TryParse。前者は失敗した場合に例外をスローし、後者はfalseを返し、プログラムはスムーズに続行します...

リンクされた質問


関連する質問

最近の質問