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