繁体   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