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 ?
部分的使用。
如果你写了扩展方法,你可以这样做:
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)??"";
当然,稍作改动:
var option = widget.Options
.Where(o => o.ExternalCode == widget.Selected)
.Select(o => o.InternalCode)
.FirstOrDefault() ?? "";
也就是说,将匹配选项的序列投影到一个内码序列,然后取那些中的第一个,默认为null
...这允许您对结果使用 null-coalescing 运算符。
您可以按照帕特里克的回答使用 null-conditional 运算符,但我个人更喜欢此答案中的代码 - 我认为它更容易理解。
Is this possible using a single line using Null Coalesce?
是的,方法如下:
var option = (widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected) ?? new Option() { InternalCode = string.Empty }).InternalCode;
到目前为止,在 Option
与 InternalCode == null
匹配的情况下,我所看到的使用单个语句的其他答案会产生错误的结果
我有 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 ?
部分的使用。
如果你写了扩展方法,你可以这样做:
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)??"";
当然,稍作改动:
var option = widget.Options
.Where(o => o.ExternalCode == widget.Selected)
.Select(o => o.InternalCode)
.FirstOrDefault() ?? "";
也就是说,将匹配选项的序列投影到一个内码序列,然后取那些中的第一个,默认为null
...这允许您对结果使用 null-coalescing 运算符。
您可以按照帕特里克的回答使用 null-conditional 运算符,但我个人更喜欢此答案中的代码 - 我认为它更容易理解。
Is this possible using a single line using Null Coalesce?
是的,方法如下:
var option = (widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected) ?? new Option() { InternalCode = string.Empty }).InternalCode;
到目前为止,在 Option
与 InternalCode == null