Gibt eine leere Auflistung, wenn Linq, wo nichts zurückgibt
-
10-07-2019 - |
Frage
Ich bin mit dem folgende Statement mit der Absicht, alle Maschinen Objekte aus der Sammlung MachineList
(Typ IEnumerable) erhalten, die eine MachineStatus
von hat i . Die MachineList
Sammlung wird nicht immer enthalten Maschinen mit einem Status von i .
Manchmal, wenn keine Maschinen haben eine MachineStatus
von i Ich möchte eine leere Sammlung zurückzukehren. Mein Aufruf an ActiveMachines
(das erste Mal verwendet wird) funktioniert, aber InactiveMachines
nicht.
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");
}
}
Bearbeiten
Bei der weiteren Untersuchung scheint es, dass jede Aufzählung von MachineList
nachfolgenden Aufzählungen von MachineList
verursacht einen exeception zu werfen. Object reference not set to an instance of an object
Daher spielt es keine Rolle, ob ein Anruf als ein Problem mit der ActiveMachines
Sammlung InactiveMachines
oder MachineList
gemacht wird. Dies ist besonders beunruhigend, weil ich kann Anrufe brechen einfach MachineList
indem er in einem Video-aufzählt, bevor es in Code aufgerufen wird. Auf seinem niedrigsten Niveau MachineList
implementiert NHibernate.IQuery
als IEnumerable
zurückgegeben wird. Was verursacht MachineList
seinen Inhalt nach einer anfänglichen Aufzählung zu verlieren?
Lösung
Where
gibt eine leere Sequenz, wenn es keine Übereinstimmungen sind; dies ist eine absolut gültige Sequenz (nicht null). Die einzige Möglichkeit, einen Null bekäme, wenn Sie FirstOrDefault
oder SingleOrDefault
nennen.
Sind Sie sicher, dass der Fehler ist, wo Sie denken, es ist?
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
Andere Tipps
Standardmäßig Enumerable.Where bereits zurückgibt einen leeren IEnumerable<T>
, nicht null. Wenn Sie sehen, „Objektverweis auf eine Instanz eines Objekts nicht festgelegt.“ Ausnahmen, es ist sehr wahrscheinlich, dass etwas anderes das Problem ist.
Ist Maschinenliste null, vielleicht? Wenn Sie es nicht angelegt hatte, würden Sie diese Ausnahme auf Ihren Anruf .Where(...)
bekommen
Außerdem, wenn Sie möchten explizit eine leere Auflistung zurück, so kann helfen ...
Enumerable.Empty<Machine>();