結果が空の場合、LINQは何を返しますか


319

LINQクエリについて質問があります。通常、クエリはIEnumerable<T>タイプを返します。戻り値が空の場合、nullかどうかは不明です。以下ToList()が例外をスローするかList<string>IEnumerable結果に何も見つからない場合は空になるかどうかはわかりませんか?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

非常に単純な質問であることはわかっていますが、当面はVSを利用できません。


11
結果はEnumerable.Emptyだと思いますか?
David.Chu.ca 2009

回答:


512

空の列挙型を返します。nullにはなりません。あなたは音を眠ることができます:)


38

.Any()メソッドを確認することもできます:

if (!YourResult.Any())

.Anyまだデータベースからレコードを取得するメモです。を実行する.FirstOrDefault()/.Where()とオーバーヘッドも同じになりますが、クエリから返されたオブジェクトをキャッチできます


5
質問はデータベースについてどこに言及していますか?
cja 2013年

4
編集した人に尋ねる必要があります。DBについては言及しませんでした:)
Noich

ポイントエディターが作成しているのは健全ですが、DBかどうかは関係ありません。彼らが言っている.Any()ことは、一致するレコードがあるかどうかを教えてくれるだけだと思います。実際のクエリを実行して特定の値を見つけると、nullで.Any()はない場合があります。
vapcguy 14

1
編集は実際には間違っている可能性があります。linq to entityを使用している場合、dbはこれをショートカットする可能性があり、trueまたはfalseを除いてクライアントにデータが送信されません
Mafii

19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(ダンプはLinqPadからのものです


丁度!調査結果をより
的確に把握

TIL Count()は単なるプロパティではなくメソッドでもあります
heyNow

2
countはすべてのアイテムを列挙するため、.Any()を使用しないでください。
SHEePYTaGGeRNeP 2017


8

Linq-to-SQLで、クエリの最初の要素を結果なしで取得しようとすると、sequence contains no elementsエラーが発生します。上記のエラーがと等しくないことを保証できますobject reference not set to an instance of an object。結論として、null sequence contains no elementsは常に言うとは言えないため、nullを返しませんobject reference not set to an instance of an object;)


1
ああ、あなたの説明はさらに理解するのに役立ちます。ありがとうございました !
ケイ・リー

これは質問に答えますか?
ChiefTwoPencils

7

ここの他の投稿では、結果が「空の」IQueryableであることを明確にしています。これはToList()が空のリストなどに正しく変更されます。

一部の演算子には注意してください。空の列挙型を送信すると、演算子がスローされます。これは、それらを一緒にチェーンすると発生する可能性があります。


3
「いくつかの演算子には注意してください。空の列挙型を送信すると、演算子がスローされます。これは、それらを一緒にチェーンすると発生する可能性があります。」-これは私を獲得したものです。nullの戻り値があり、それを別のクエリに送りました。これにより、2番目のクエリに値が渡されなかったため、2番目のクエリは、キャスト先に関係なくスローされました。
trevorc 2011年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.