العودة فارغة جمع عند Linq حيث يعود شيء
-
10-07-2019 - |
سؤال
أنا باستخدام أدناه بيان بقصد الحصول على كل من آلة الكائنات من MachineList
جمع (نوع IEnumerable) أن يكون MachineStatus
من أنا.على MachineList
مجموعة لا تحتوي دائما على الآلات مع حالة أنا.
في بعض الأحيان عندما لا الآلات لديها MachineStatus
من أنا أود العودة فارغة جمع.ندائي ActiveMachines
(الذي يستخدم الأولى) يعمل ولكن InactiveMachines
لا.
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");
}
}
تحرير
بناء على دراسة أخرى يبدو أن أي تعداد MachineList
سوف يسبب اللاحقة والتعدادات من MachineList
لرمي exeception: Object reference not set to an instance of an object
.
لذلك لا يهم إذا كان يتم إجراء مكالمة إلى ActiveMachines
أو InactiveMachines
كما لها مشكلة مع MachineList
جمع.هذا هو مزعج ولا سيما لأنه لا يمكن كسر المكالمات MachineList
ببساطة عن طريق تعداد في ساعة قبل أن يطلق عليه في التعليمات البرمجية.في أدنى مستوى له MachineList
تنفذ NHibernate.IQuery
كونه عاد كما IEnumerable
.ما تسبب MachineList
تفقد محتوياتها بعد أولية التعداد?
المحلول
Where
ترجع فارغة تسلسل إذا كان هناك أي المباريات ؛ هذا هو تماما صالحة تسلسل (not 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.حيث بالفعل لا تعود فارغة IEnumerable<T>
, وليس null.إذا كنت ترى "كائن مرجع لم يتم تعيينها إلى مثيل الكائن." استثناءات ، فمن الأرجح أن شيئا آخر هو المشكلة.
هو MachineList null, ربما ؟ إذا لم أكن قد خلقت لك الحصول على هذا الاستثناء على الاتصال الخاص بك إلى .Where(...)
بالإضافة إلى ذلك, إذا كنت ترغب في صراحة العودة فارغة جمع هذا يمكن أن تساعد في...
Enumerable.Empty<Machine>();