6

我有 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 的单行吗?

4

4 回答 4

15

是的,您可以使用 null 传播和 null 合并运算符,如果您可以使用 C# 6,这将满足您的需求:

var option = widget.Options
             .SingleOrDefault(o => o.ExternalCode == widget.Selected)?.InternalCode
             ?? string.Empty;

?.将转化为您对option == null ?零件的使用。

于 2016-01-06T10:37:06.797 回答
9

当然,稍作改动:

var option = widget.Options
                   .Where(o => o.ExternalCode == widget.Selected)
                   .Select(o => o.InternalCode)
                   .FirstOrDefault() ?? "";

换句话说,将匹配选项序列投影到一系列内部代码,然后采用其中的第一个默认为null... 这允许您对结果使用 null 合并运算符。

您可以按照帕特里克的回答使用空条件运算符,但我个人更喜欢这个答案中的代码 - 我认为它更容易理解。

于 2016-01-06T10:38:04.777 回答
2

如果您编写了扩展方法,则可以这样做:

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)??"";
于 2016-01-06T10:37:43.630 回答
0

这可能使用使用 Null Coalesce 的单行吗?

是的,方法如下:

var option = (widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected) ?? new Option() { InternalCode = string.Empty }).InternalCode;

到目前为止,我看到的使用单个语句的其他答案在存在Optionwith的匹配实例的情况下会产生错误的结果InternalCode == null

于 2016-01-06T11:23:48.407 回答