検索したところ、いつ使用したいのかについて明確な回答が得られていません。.First
そしていつ使いたいのか.FirstOrDefault
LINQで。
いつ使いたいですか.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()
シーケンスが少なくとも1つの要素を持つことを知っているか、または期待しているとき。つまり、シーケンスが空であることが例外的な場合です。
つかいますFirstOrDefault()
要素があるかどうかを確認する必要があることを知っているとき。言い換えれば、シーケンスが空であることが正当な場合です。チェックを例外処理に頼るべきではありません。 (これは悪い習慣であり、パフォーマンスを損なう可能性があります)。
最後に、の違いFirst()
そしてTake()
ということですFirst()
要素自体を返します。Take()
正確に1つの要素を含む一連の要素を返します。 (パラメータとして1を渡した場合)
.First
結果がない場合は例外をスローします。.FirstOrDefault
しないでください、それは単にnull(参照型)または値型のデフォルト値を返します。 (例:0
ここでの質問は、あなたがデフォルトの型が欲しいときではありませんが、もっともっと:あなたは、例外を処理することを望みますかそれともデフォルト値を処理しますか?例外は例外的なはずですから、FirstOrDefault
クエリから結果が得られるかどうかがわからない場合は推奨されます。論理的にデータがあるはずの場合は、例外処理を検討することができます。
Skip()
そしてTake()
結果のページングを設定するときに通常使用されます。 (最初の10件の結果を表示し、次の10件を次のページに表示するなど)
お役に立てれば。
.FirstOrDefault
参照型の場合はnullを返します。 「デフォルト」とは何か混乱していました。オブジェクトはなります。この答えはそれをクリアしました。 - Mike Taverne
.First()は、返す行がない場合に例外をスローします。一方、.FirstOrDefault()はデフォルト値を返します(NULL
代わりにすべての参照型に対して)
それで、もしあなたが準備ができていて可能性のある例外を処理する気があるならば、.First()
結構です。とにかく!= nullの戻り値を確認したい場合は、.FirstOrDefault()
あなたのより良い選択です。
しかし、これも個人的な好みのようなものです。どちらを使うかはあなたにとってより理にかなっており、あなたのコーディングスタイルによりよく合っています。
最初()
FirstOrDefault()
UserInfosテーブルがあります。これには、次に示すようなレコードがいくつかあります。以下のこの表に基づいて、私は例を作成しました...
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()
。
まず第一に、Take
完全に異なる方法です。それを返しますIEnumerable<T>
そして単一ではないT
これで終わりです。
の間にFirst
そしてFirstOrDefault
、あなたが使うべきですFirst
要素が存在することを確認したときに存在しない場合はエラーが発生します。
ところで、あなたのシーケンスがdefault(T)
要素(例:null
そして、あなたは空であることと最初の要素であることを区別する必要がありますnull
、使えないFirstOrDefault
。
最初:
FirstOrDefault:
から:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
注目すべきもう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));
}
最初()
その結果が予想される複数の要素を含んでいることがわかっていて、sequenceの最初の要素だけがあるべきです。
FirstOrDefault()
FirstOrDefault()はFirst()と似ていますが、指定された条件に一致する要素がない場合は、基になるジェネリックコレクションの型のデフォルト値が返される点が異なります。要素が見つからない場合、InvalidOperationExceptionはスローされません。しかし、要素またはシーケンスのコレクションは、例外をスローするよりもnullです。
私はFirstOrDefaultの必要性を説明するように訴えるウェブサイトを見つけました
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
クエリに結果がなく、First()またはSingle()を呼び出して単一行を取得するとします... "シーケンスに要素が含まれていません"という例外が発生します。
免責事項:私はLINQを使用したことがないので、これがマークから離れている場合は私の謝罪。
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)
どれを使う? それはビジネスロジックによって決定されるべきで、例外/プログラムの失敗の恐れではありません。
例えば、 ビジネスロジックから、どの営業日にもトランザクションがゼロになることはあり得ないと言われた場合(ただ仮定)。それからあなたはいくつかのスマートなプログラミングでこのシナリオを処理しようとするべきではありません。 私はいつもFirst()をそのようなコレクションの上で使います、そして何か他のものがビジネスロジックを台無しにしたならプログラムを失敗させます。
コード:
var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()
これについて他の人のコメントを見たいのですが。
[OK]を私に2セントを与えましょう。 First / Firstまたはdefaultは、2番目のコンストラクタを使用するときのものです。それが何であるかは説明しませんが、例外を発生させたくないので、あなたが潜在的にいつもそれを使う時です。
person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
return string.IsNullOrEmpty(p.Relationship);
}));
このタイプの関数は要素演算子に属します。いくつかの便利な要素演算子を以下に定義します。
特定の条件に基づいてシーケンスから単一の要素を選択する必要がある場合は、要素演算子を使用します。これが一例です。
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();
古い投稿への回答を投稿して申し訳ありません。詳細と良い説明ですので、以下のURLを読んでください。http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
コレクションに単一の単純なクエリを実装するには、多くの方法があります。結合をsqlで記述するだけで、必要性と必要性に応じてフィルタを最初または最後に適用できます。
これは、コレクション内でIDを持つ要素を見つけることができる例です。
これをさらに追加するには、メソッドまず、FirstOrDefault
、コレクションが少なくとも1つのレコードを持っているとき、理想的には同じを返します。ただし、コレクションが空でも問題ない場合は。それからFirst
例外を返しますがFirstOrDefault
戻りますnull
またはデフォルト。例えば、int
したがって、そのような使用法は個人的な好みであると言われていますが、使用するのがより良いです。FirstOrDefault
例外処理を避けるため
.First
そして.FirstOrDefault
どちらも述語を引数としてとるので、var result = List.Where(x => x == "foo").First();
ように書き直すことができるvar result = List.First(x => x == "foo");
- Rian SchmitsSingle
そしてSingleOrDefault
。人々が使用するとき私は嫌いFirst
本当に意味があるときSingle
; ) - BartoszKP