[英]null reference exception with linq .where clause
我試圖從一個可以為 null 的對象數組(數組)中獲取一個屬性,但我總是得到一個 null 引用異常。
如果它為 null 或返回空字符串,我如何告訴 LINQ 不處理它?
foreach (Candidate c in candidates) {
results.Add(new Person
{
firstName = c.firstname, //ok
lastName = c.Name, //ok
// contactItems is an array of ContactItem
// so it can be null that's why I get null exception
// when it's actually null
phone = c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).First().contactText
}
);
}
我也試過不取空值。 如果數組為空,我沒有得到告訴 LINQ 不要處理的機制。
phone = c.address.contactItems.Where( ci => ci != null && ci.contactType == ContactType.PHONE).First().contactText
您可以使用?:
(條件)運算符檢查它是否為null
:
phone = c.address.contactItems == null ? ""
: c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).First().contactText
如果First
拋出異常,因為沒有人使用ContactType.PHONE
,您可以將DefaultIfEmpty
與自定義默認值一起使用:
c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE)
.DefaultIfEmpty(new Contact{contactText = ""})
.First().contactText
請注意, First
現在不能再拋出異常,因為我提供了默認值。
試試下面的代碼(我假設contactText
是一個string
)。
您可能希望將公共屬性名稱的大寫標准化為全部以大寫字母開頭。
foreach (Candidate c in candidates) {
string contactText =
c.address.contactItems
.Where(ci => ci.contactType == ContactType.PHONE)
.Select(ci => ci.contactText)
.FirstOrDefault()
results.Add(
new Person
{
firstName = c.firstname,
lastName = c.Name,
phone = contactText ?? string.Empty
});
}
嘗試:
var contact = c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).FirstOrDefault();
phone = contact != null ? contact.contactText : "";
null
值是contactType
所以我們添加(ci.contactType != null)
var phone = c.address.contactItems.Where( ci => (ci.contactType != null) && ci.contactType == ContactType.PHONE).First().contactText
foreach (Candidate c in candidates) {
results.Add(new Person
{
firstName = c.firstname, //ok
lastName = c.Name, //ok
// contactItems is an array of ContactItem
// so it can be null that's why I get null exception
// when it's actually null
phone = c.address.contactItems == null
? string.Empty
:c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).First().contactText
}
); }
像下面這樣在 linq 中避免參數 null 異常
Summaries = (from r in Summaries
where r.Contains(SearchTerm)
orderby r
select r).ToArray();
在這種情況下,如果 null 傳遞給 searchTerm 您可以檢查 null 表達式,如下所示
Summaries = (from r in Summaries
where string.IsNullOrEmpty(SearchTerm) ||r.Contains(SearchTerm)
orderby r
select r).ToArray();
這個對我有用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.