C# Null объединяется с 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?

4 ответа

Решение

Да, вы можете использовать операторы распространения нуль и объединения нулей, что соответствует вашим потребностям, если вы можете использовать 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... который позволяет использовать оператор слияния нулей для результата.

Вместо этого вы можете использовать нулевой условный оператор в соответствии с ответом Патрика, но лично я предпочел бы код в этом ответе - я думаю, что это проще для понимания.

Вы можете сделать это, если вы написали метод расширения:

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

Другие вопросы по тегам