Linq whereが何も返さない場合、空のコレクションを返します
-
10-07-2019 - |
質問
MachineList
コレクションが i であるMachineStatus
コレクション(IEnumerable型)からすべてのマシンオブジェクトを取得する目的で、以下のステートメントを使用しています。 ActiveMachines
コレクションには、ステータスが i のマシンが常に含まれるとは限りません。
i のInactiveMachines
を持つマシンが存在しない場合、空のコレクションを返します。 Object reference not set to an instance of an object
(最初に使用される)への呼び出しは機能しますが、NHibernate.IQuery
は機能しません。
public IEnumerable<Machine> ActiveMachines
{
get
{
return Customer.MachineList
.Where(m => m.MachineStatus == "a");
}
}
public IEnumerable<Machine> InactiveMachines
{
get
{
return Customer.MachineList
.Where(m => m.MachineStatus == "i");
}
}
編集
さらに調べてみると、IEnumerable
の列挙により、以降の<=>の列挙が例外をスローするようです:<=>。
したがって、<=>コレクションの問題として<=>または<=>の呼び出しが行われたかどうかは関係ありません。これは、コードで呼び出される前にWatchで列挙するだけで<=>の呼び出しを中断できるため、特に厄介です。最下位レベルの<=>は、<=>として返される<=>を実装します。 <=>が最初の列挙後に内容を失う原因は何ですか?
解決
Where
は、一致するものがない場合は空のシーケンスを返します。これは完全に有効なシーケンスです(nullではありません)。 nullを取得する唯一の方法は、FirstOrDefault
またはSingleOrDefault
を呼び出す場合です。
バグはあなたが思うところにあると確信していますか?
int?[] nums = { 1, 3, 5 };
var qry = nums.Where(i => i % 2 == 0);
Console.WriteLine(qry == null); // false
Console.WriteLine(qry.Count()); // 0
var list = qry.ToList();
Console.WriteLine(list.Count); // 0
var first = qry.FirstOrDefault();
Console.WriteLine(first == null); // true
他のヒント
デフォルトでは、 Enumerable.Where はすでに空を返しますIEnumerable<T>
、nullではありません。 <!> quot;オブジェクトのインスタンスに設定されていないオブジェクト参照が表示されている場合。<!> quot;例外として、他の何かが問題である可能性が高いです。
MachineListはnullですか?作成していない場合、.Where(...)
さらに、空のコレクションを明示的に返す場合、これが役立ちます...
Enumerable.Empty<Machine>();