2014-02-14 30 views
1

我有一個零件列表partList。我想通過篩選Number來獲得零件的Name。像在LINQ中集成NULL檢查

var foundPart = partList.Where(part => part.Number == 1).SingleOrDefault(); 
if(foundPart != null) 
    name = foundPart.Name; 

什麼事情我可以消除null檢查,把一切都在LINQ命令?

+1

我會堅持使用當前的空檢查,遠遠超過任何其他可讀基於在空合併運算符恕我直言。 – ken2k

+0

你不能在你最初創建partList的時候這樣做嗎? –

+0

@ ken2k其實我也喜歡簡單的'if','foreach'等,並且在可能的時候使用它們。因爲它很容易理解。我相信易於理解的代碼是最好的代碼 –

回答

8
string name = partList.Where(part => part.Number == 1) 
         .Select(part => part.Name) // project result here 
         .SingleOrDefault(); 

如果你想避免更改名稱時沒有找到匹配:

name = partList.Where(part => part.Number == 1) 
       .Select(part => part.Name) 
       .DefaultIfEmpty(name) 
       .Single(); 

注:我喜歡LINQ,但在這種情況下,我將簡化您的查詢一點點,並保持如果條件。非常清晰,簡單易懂:

var part = parts.SingleOrDefault(p => p.Number == 1); 

if(part != null) 
    name = part.Name; 
+0

這會將null設置爲「name」;如果沒有結果,目前OP不更新「名稱」。 – ken2k

+0

@ ken2k謝謝,錯過了那部分。更新了答案 –

2

如果foundPartnull會發生什麼情況?

如果你確定與name被空:

var name = partList 
      .Where(part => part.Number == 1) 
      .Select(part => part.Name) 
      .SingleOrDefault(); 

如果你想將它設置爲別的東西,使用空合併運算符:

var name = partList 
      .Where(part => part.Number == 1) 
      .Select(part => part.Name) 
      .SingleOrDefault() ?? "Default Name"; 

如果你不這樣做想要觸摸name,那麼就沒有辦法簡化你已有的東西。

-1

你可以使用.FirstOrDefault()而不是.SingleOrDefault()

var foundPart = partList.Where(part => part.Number == 1).FirstOrDefault() ?? "Default";