2012-11-21 5 views
18

私はいくつかのIEnumberableコレクションを持っています。私は.Single()を使ってコレクション内の特定のオブジェクトを見つけます。LINQ Single()0または複数のアイテムの例外

Single()を使用することを選択したのは、特定のアイテムが1つだけであるためです。しかし、存在しない場合は、作成してコレクションに追加する必要があります。

私の問題は、述語に一致する項目がない場合、または複数の項目がある場合、Single()は同じエラーをスローします。私の考えは、試しにSingle()コールを入れて例外をキャッチし、そのアイテムを追加してから、続けます。しかし、両方のシナリオでInvalidOperationExceptionが投げられるので、アイテムがないか複数のアイテムが原因であるかどうかをどのように判断できますか?

私はFirst()を使うことができると知っていますが、余分な作業をすることなく、1つしかなければならないという考えを強制しません。

私もSingle()呼び出しの前Count()を使用することができますが、それはちょうどあなたが欲しいSingle()

答えて

32

のポイントを弱体化させるように思わSingleOrDefault()

「またはデフォルトでは、」実際には参考のために(nullを返す意味しています型)または非参照型の既定値となります。あなたはその場所を取るためにオブジェクトを新しくする必要があります。

+5

まあ、要素型のデフォルト値を返します。参照型ではnullですが、null値ではない値の型ではないことは明らかです... –

+1

...ヌルチェックをチェーンしたい場合は、このようなものを使用してください。http://napoleonss.wordpress.com/2011/12/ 20/my-check-null /。 デフォルトで動作します。 – napoleonss

+0

@JonSkeet正しいです。私は彼が参照型について話していると思った。 –

4

論理的な判断を下すために例外を使用するとリソースが高価になるため、このシナリオでtry/catchを使用することはお勧めしません。

SingleOrDefault()を使用し、結果がnullであることを確認することをおすすめします。もしそれが。あなたの創造を行いますか?

+4

"リソースが高価" - 古くなった/間違ったビューです。ここで提供されているRico Marianiリンクを参照してください。 http://stackoverflow.com/q/891217/16391私は、論理的な決定を下すために例外を使用することは設計上の選択肢が乏しいことに同意します。 – StingyJack

関連する問題