[英]C# Null coalesce with LINQ
我有2個類,看起來像這樣:
class Widget
{
string Selected { get; set; }
List<Option> Options { get; set; }
}
class Option
{
string InternalCode { get; set; }
string ExternalCode { get; set; }
}
每個客戶端使用不同的數據動態填充Options
,以顯示ExternalCode
作為選項
Selected
使用ExternalCode
填充。
然后我需要訪問匹配的InternalCode
。
目前我這樣做:
var option = widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected);
var internalCode = option == null ? string.Empty : option.InternalCode;
這是否可以使用Null Coalesce使用單行?
是的,您可以使用null傳播和null合並運算符,如果您可以使用C#6,則可以滿足您的需求:
var option = widget.Options
.SingleOrDefault(o => o.ExternalCode == widget.Selected)?.InternalCode
?? string.Empty;
?.
將轉換為您使用option == null ?
部分。
當然,只需稍加改動:
var option = widget.Options
.Where(o => o.ExternalCode == widget.Selected)
.Select(o => o.InternalCode)
.FirstOrDefault() ?? "";
換句話說,項目匹配選項的內部代碼序列,然后順序采取先者的,默認為null
...它允許您使用空合並運算的結果。
您可以根據Patrick的答案使用空條件運算符,但我個人更喜歡這個答案中的代碼 - 我認為它更容易理解。
如果你編寫了擴展方法,你可以這樣做:
public static class MonadExtensions
{
public static TResult With<TSource, TResult>(TSource source, Func<TSource, TResult> action) where TSource : class
{
if (source != default(TSource))
return action(source);
return default(TResult);
}
}
並使用它:
var internalCode = widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected).With(o=>o.InternalCode)??"";
這是否可以使用Null Coalesce使用單行?
是的,這是如何:
var option = (widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected) ?? new Option() { InternalCode = string.Empty }).InternalCode;
到目前為止,使用單個語句的其他答案會產生錯誤的結果,如果有一個匹配的Option
實例與InternalCode == null
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.