gpt4 book ai didi

c# - LINQ:当对象可能为 null 时选择属性的更好方法?

转载 作者:行者123 更新时间:2023-12-02 01:05:20 25 4
gpt4 key购买 nike

var result = foo.FirstOrDefault(f => f.bar == barVal).someProperty

如果没有匹配(默认为 null),这将不起作用 - 尝试访问 null 对象的属性。我们可以重写如下:

var result = foo.Where(f => f.bar == barVal)
.Select(f => f.someProperty).DefaultIfEmpty(0).First()

虽然它有效,但这似乎不是最优雅的方法...有更好的方法吗?


当然可以这样做:

var result = 0;
var tmp = foo.FirstOrDefault(f => f.bar == barVal);
if(tmp != null) result = tmp.someProperty

但在更复杂的查询中,这种方法看起来比 DefaultIfEmpty 方法更“困惑”

var tmpSet = dataSet.GroupBy(f => f.ID);
var newSet = tmp.Select(f => new {
ID = f.ID,
SomeProperty = f.Where(g => g.bar == barVal)
.Select(f => f.SomeProperty)
.DefaultIfEmpty(0).First()
});

最佳答案

你可以这样做:

var result = foo.Where(f => f.bar == barVal)
.Select(f => f.someProperty)
.FirstOrDefault();

或者您可以编写自定义扩展方法:

public static TResult IfNotNull<TSource, TResult>(this TSource instance, Func<TSource, TResult> getter, TResult defaultValue = default(TResult))
where TSource : class
{
if (instance != null)
return getter(instance);
return defaultValue;
}

...

var result = foo.FirstOrDefault(f => f.bar == barVal)
.IfNotNull(f => f.someProperty);

编辑:使用 C# 6,您可以这样写:

var result = foo.FirstOrDefault(f => f.bar == barVal)?.someProperty ?? 0;

参见 this discussion有关详细信息,请访问 Roslyn Codeplex 网站。

关于c# - LINQ:当对象可能为 null 时选择属性的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com