簡體   English   中英

C#Null與LINQ合並

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM