我有一個零件列表partList
。我想通過篩選Number
來獲得零件的Name
。像在LINQ中集成NULL檢查
var foundPart = partList.Where(part => part.Number == 1).SingleOrDefault();
if(foundPart != null)
name = foundPart.Name;
什麼事情我可以消除null
檢查,把一切都在LINQ命令?
我有一個零件列表partList
。我想通過篩選Number
來獲得零件的Name
。像在LINQ中集成NULL檢查
var foundPart = partList.Where(part => part.Number == 1).SingleOrDefault();
if(foundPart != null)
name = foundPart.Name;
什麼事情我可以消除null
檢查,把一切都在LINQ命令?
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;
這會將null設置爲「name」;如果沒有結果,目前OP不更新「名稱」。 – ken2k
@ ken2k謝謝,錯過了那部分。更新了答案 –
如果foundPart
是null
會發生什麼情況?
如果你確定與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
,那麼就沒有辦法簡化你已有的東西。
你可以使用.FirstOrDefault()而不是.SingleOrDefault()
var foundPart = partList.Where(part => part.Number == 1).FirstOrDefault() ?? "Default";
我會堅持使用當前的空檢查,遠遠超過任何其他可讀基於在空合併運算符恕我直言。 – ken2k
你不能在你最初創建partList的時候這樣做嗎? –
@ ken2k其實我也喜歡簡單的'if','foreach'等,並且在可能的時候使用它們。因爲它很容易理解。我相信易於理解的代碼是最好的代碼 –