716

検索したところ、いつ使用したいのかについて明確な回答が得られていません。.Firstそしていつ使いたいのか.FirstOrDefaultLINQで。

  • いつ使いたいですか.First?結果が返されない場合に例外をキャッチしたい場合にのみ使用します。

    var result = List.Where(x => x == "foo").First();
    
  • そしていつ使用したいですか.FirstOrDefault?結果が得られない場合は、いつでもデフォルトの型が必要ですか。

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • そしてそのことについては、Takeはどうですか?

    var result = List.Where(x => x == "foo").Take(1);
    


  • .Firstそして.FirstOrDefaultどちらも述語を引数としてとるので、var result = List.Where(x => x == "foo").First();ように書き直すことができるvar result = List.First(x => x == "foo"); - Rian Schmits
  • 検討することを忘れないでくださいSingleそしてSingleOrDefault。人々が使用するとき私は嫌いFirst本当に意味があるときSingle; ) - BartoszKP
  • 複数の要素が返されると、SingleまたはSingleOrDefaultは例外をスローします。私はFirstOrDefaultが最も一般的なケースでより良いと思います! - Eric Draven
  • ポイントはあなたがあなたがそう言うべきである単一の結果を期待するときであり、例外はあなたの論理が失敗したことを示す。 - NetMage
  • その全体を説明する優れた記事。donnfelker.com/linq-single-vs-first - Latency

14 답변


715

私は使うだろうFirst()シーケンスが少なくとも1つの要素を持つことを知っているか、または期待しているとき。つまり、シーケンスが空であることが例外的な場合です。

つかいますFirstOrDefault()要素があるかどうかを確認する必要があることを知っているとき。言い換えれば、シーケンスが空であることが正当な場合です。チェックを例外処理に頼るべきではありません。 (これは悪い習慣であり、パフォーマンスを損なう可能性があります)。

最後に、の違いFirst()そしてTake()ということですFirst()要素自体を返します。Take()正確に1つの要素を含む一連の要素を返します。 (パラメータとして1を渡した場合)


  • @driis - FirstとFirstOrDefaultのどちらを選択するかについては、例外的な例外ガイドラインの要点を使用できると思います。明確な答えをありがとう。 - Metro Smurf
  • 私が追加する唯一のことは、選択しているタイプのデフォルト値が有効な値である場合、例えばあなたの結果がint値0である場合、例外を処理することが最良であるように思われるということです。これを処理する方法。 - PeterBelm
  • それを達成するためのはるかに優れた方法を見つけたので、使用してください:DefaultIfEmpty(-1).First() - PeterBelm
  • Takeは厳密に1つの要素を返さず、せいぜい1つの要素を返します(もちろん1を指定した場合)。シーケンスが最初は空の場合は、0要素を返すこともあります。 - SPIRiT_1984
  • @ RoyiNamir、はい、取るべきパラメーターが1であるという質問の文脈では、私はまたその文の直後に親であることにも注意しました。 - driis

244

.First結果がない場合は例外をスローします。.FirstOrDefaultしないでください、それは単にnull(参照型)または値型のデフォルト値を返します。 (例:0ここでの質問は、あなたがデフォルトの型が欲しいときではありませんが、もっともっと:あなたは、例外を処理することを望みますかそれともデフォルト値を処理しますか?例外は例外的なはずですから、FirstOrDefaultクエリから結果が得られるかどうかがわからない場合は推奨されます。論理的にデータがあるはずの場合は、例外処理を検討することができます。

Skip()そしてTake()結果のページングを設定するときに通常使用されます。 (最初の10件の結果を表示し、次の10件を次のページに表示するなど)

お役に立てれば。


  • @Jeroen - スキップ/テイクを使用するためのより良いユースケースに関する良い点。 - Metro Smurf
  • 説明のために+1.FirstOrDefault参照型の場合はnullを返します。 「デフォルト」とは何か混乱していました。オブジェクトはなります。この答えはそれをクリアしました。 - Mike Taverne

94

.First()は、返す行がない場合に例外をスローします。一方、.FirstOrDefault()はデフォルト値を返します(NULL代わりにすべての参照型に対して)

それで、もしあなたが準備ができていて可能性のある例外を処理する気があるならば、.First()結構です。とにかく!= nullの戻り値を確認したい場合は、.FirstOrDefault()あなたのより良い選択です。

しかし、これも個人的な好みのようなものです。どちらを使うかはあなたにとってより理にかなっており、あなたのコーディングスタイルによりよく合っています。


  • 軽微な修正 - FirstOrDefaultは参照型の場合はnullを、値型の場合はデフォルト値を返します。 - Jamie Ide

59

最初()

  1. シーケンスの最初の要素を返します。
  2. 結果に要素がないかソースがnullの場合、エラーが発生します。
  3. 複数の要素が予想され、最初の要素だけが必要な場合は、それを使用してください。

FirstOrDefault()

  1. シーケンスの最初の要素を返します。要素が見つからない場合はデフォルト値を返します。
  2. ソースがnullの場合にのみエラーをスローします。
  3. 複数の要素が予想され、最初の要素だけが必要な場合は、それを使用してください。 結果が空の場合も良いです。

UserInfosテーブルがあります。これには、次に示すようなレコードがいくつかあります。以下のこの表に基づいて、私は例を作成しました...

UserInfo Table

First()の使い方

var result = dc.UserInfos.First(x => x.ID == 1);

ID == 1のレコードは1つだけです。このレコードを返す必要があります

ID:1姓:Manish姓:Dubey Eメール:xyz@xyz.com

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

FName == "Rahul"のレコードが複数あります。最初のレコードは返却する必要があります。

ID:7名前:Rahul姓:Sharma Eメール:xyz1@xyz.com

var result = dc.UserInfos.First(x => x.ID ==13);

ID == 13のレコードはありません。エラーが発生するはずです。

InvalidOperationException:シーケンスに要素が含まれていません

FirstOrDefault()の使い方

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

ID == 1のレコードは1つだけです。このレコードを返す必要があります

ID:1姓:Manish姓:Dubey Eメール:xyz@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

FName == "Rahul"のレコードが複数あります。最初のレコードは返却する必要があります。

ID:7名前:Rahul姓:Sharma Eメール:xyz1@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

ID == 13のレコードはありません。戻り値はnullです。

いつ使用するかを理解するのに役立つことを願っていますFirst()またはFirstOrDefault()


  • 私の意見では、「エラーが発生するはずです」というステートメントです。 3番目のFirstOrDefault()の下で - 例は誤解を招くようです。 - Jannik
  • こんにちは、あなたはよく説明しますが、結合からデータを取得するときと、そのときに使用されている外部キーテーブルにIDが存在しないときに少し混乱しますか。現在、私はFirst()を使用していますが、あなたの答えを読んだ後にはわかりません。助けてください。 - Brijesh Mavani

18

まず第一に、Take完全に異なる方法です。それを返しますIEnumerable<T>そして単一ではないTこれで終わりです。

の間にFirstそしてFirstOrDefault、あなたが使うべきですFirst要素が存在することを確認したときに存在しない場合はエラーが発生します。

ところで、あなたのシーケンスがdefault(T)要素(例:nullそして、あなたは空であることと最初の要素であることを区別する必要がありますnull、使えないFirstOrDefault


  • @ Mehrdad - すばらしい点、re:.FirstはIEnumerableを返し、FirstOrDefaultを使用しない場合。 - Metro Smurf

13

最初:

  • シーケンスの最初の要素を返します
  • 例外をスローします。結果に要素はありません
  • 次の場合に使用します。複数の要素が必要で、最初の要素のみが必要な場合

FirstOrDefault:

  • シーケンスの最初の要素を返します。要素が見つからない場合はデフォルト値を返します。
  • 例外が発生します。ソースがnullの場合のみ
  • 次の場合に使用します。複数の要素が予想され、最初の要素のみが必要な場合。結果が空でも問題ありません。

から:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/


6

注目すべきもう1つの違いは、プロダクション環境でアプリケーションをデバッグしている場合、行番号にアクセスできない可能性があることです。.First()メソッド内のステートメントは例外を投げました難しいかもしれません。

例外メッセージには、使用した可能性があるLambda式も含まれていないため、デバッグが難しくなります。

それが私がいつも使う理由ですFirstOrDefault()たとえ私がnullエントリが例外的な状況を構成することを知っていたとしても。

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}


4

最初()

その結果が予想される複数の要素を含んでいることがわかっていて、sequenceの最初の要素だけがあるべきです。

FirstOrDefault()

FirstOrDefault()はFirst()と似ていますが、指定された条件に一致する要素がない場合は、基になるジェネリックコレクションの型のデフォルト値が返される点が異なります。要素が見つからない場合、InvalidOperationExceptionはスローされません。しかし、要素またはシーケンスのコレクションは、例外をスローするよりもnullです。


  • こんにちは、あなたはよく説明しますが、結合からデータを取得するときと、そのときに使用されている外部キーテーブルにIDが存在しないときに少し混乱しますか。現在、私はFirst()を使用していますが、あなたの答えを読んだ後にはわかりません。助けてください。 - Brijesh Mavani

3

私はFirstOrDefaultの必要性を説明するように訴えるウェブサイトを見つけました

http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/

クエリに結果がなく、First()またはSingle()を呼び出して単一行を取得するとします... "シーケンスに要素が含まれていません"という例外が発生します。

免責事項:私はLINQを使用したことがないので、これがマークから離れている場合は私の謝罪。


  • リンクはもううまくいきません。 - Peroxy

2

someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

どれを使う? それはビジネスロジックによって決定されるべきで、例外/プログラムの失敗の恐れではありません。

例えば、 ビジネスロジックから、どの営業日にもトランザクションがゼロになることはあり得ないと言われた場合(ただ仮定)。それからあなたはいくつかのスマートなプログラミングでこのシナリオを処理しようとするべきではありません。 私はいつもFirst()をそのようなコレクションの上で使います、そして何か他のものがビジネスロジックを台無しにしたならプログラムを失敗させます。

コード:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

これについて他の人のコメントを見たいのですが。


  • 参照型およびnull許容型のデフォルト値はnullです。 - dsa
  • すぐに失敗するのは良いことです - しかし、あなたが説明したシナリオでは、まず最初にそれを失敗させ、例外をキャッチし、そして意味のあるエラーを返すのを見ます。同様にcatch(InvalidOperationException e){新しいInvalidOperationExceptionをスローする(" 1日にトランザクションを0にすることはできません!"、e)};しかし、実際のビジネスロジックの問題に対処するのを避けるためにデフォルトを使用することは非常に悪いです。 - Mathieson

1

[OK]を私に2セントを与えましょう。 First / Firstまたはdefaultは、2番目のコンストラクタを使用するときのものです。それが何であるかは説明しませんが、例外を発生させたくないので、あなたが潜在的にいつもそれを使う時です。

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));


  • ではない正確に。最初のコンストラクタは、1つの項目だけを取得する必要がある場合、または配列ではない値に結果を代入するときにコンパイルエラーを回避する必要がある場合に広く使用されています。追加の.Where()を使用するよりも2番目のコンストラクタを使用する方が速いように見えるかもしれませんが(と思うLINQは最初のものを見つけた後にリスト内の項目の評価を停止します)それは常に最初の要素で停止します - usr-local-ΕΨΗΕΛΩΝ

0

このタイプの関数は要素演算子に属します。いくつかの便利な要素演算子を以下に定義します。

  1. First / FirstOrDefault
  2. Last / LastOrDefault
  3. シングル/シングルまたはデフォルト

特定の条件に基づいてシーケンスから単一の要素を選択する必要がある場合は、要素演算子を使用します。これが一例です。

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };

First()演算子は、条件が満たされた後でシーケンスの最初の要素を返します。要素が見つからない場合は、例外がスローされます。

int result = items.Where(item => item == 2).First();

FirstOrDefault()演算子は、条件が満たされた後でシーケンスの最初の要素を返します。要素が見つからない場合は、その型のデフォルト値を返します。

int result1 = items.Where(item => item == 2).FirstOrDefault();


-3

古い投稿への回答を投稿して申し訳ありません。詳細と良い説明ですので、以下のURLを読んでください。http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

http://www.dotnet-tricks.com/Tutorial/linq/E23I160714-Understanding-Single,-SingleOrDefault,-First-and-FirstOrDefault.html

http://www.c-sharpcorner.com/UploadFile/3d39b4/singleordefault-and-firstordefault-methods-in-linq-to-sql/


  • 将来リンクが壊れた場合に備えて、内容を要約すると便利です。そのようにしても、この答えはStackOverflowにはなお有用です。 - Brian J

-8

コレクションに単一の単純なクエリを実装するには、多くの方法があります。結合をsqlで記述するだけで、必要性と必要性に応じてフィルタを最初または最後に適用できます。

これは、コレクション内でIDを持つ要素を見つけることができる例です。 これをさらに追加するには、メソッドまず、FirstOrDefault、コレクションが少なくとも1つのレコードを持っているとき、理想的には同じを返します。ただし、コレクションが空でも問題ない場合は。それからFirst例外を返しますがFirstOrDefault戻りますnullまたはデフォルト。例えば、intしたがって、そのような使用法は個人的な好みであると言われていますが、使用するのがより良いです。FirstOrDefault例外処理を避けるためhere is an example where, we run over a collection of transactionlist

リンクされた質問


関連する質問

最近の質問