【问题标题】:returning default value if a property is null如果属性为 null,则返回默认值
【发布时间】:2015-10-04 23:50:36
【问题描述】:

根据文档,您知道有一个名为 DefaultIfEmpty 的扩展方法:

DefaultIfEmpty

返回指定序列的元素或类型参数的 如果序列为空,则为单例集合中的默认值。

所以这种情况下如果序列为空,则返回一个默认值,例如看this答案:

opencall.Priority = averages.Where(x => x.ProblemCode == opencall.ProblemCode)
                            .Select(x => x.Priority)
                            .DefaultIfEmpty("")
                            .Single(); 

在此示例中,如果平均值为空,则返回一个空字符串,但我想知道 linq 中是否有类似扩展方法的东西,以便如果 preperty (x.Priority) 为空,则返回默认值?

PS:我知道我们可以使用if 语句来检查:

opencall.Priority = averages.Where(x => x.ProblemCode == opencall.ProblemCode)
                            .Select(x => x.Priority)
                            .DefaultIfEmpty("")
                            .Single(); 
if (!string.IsNullOrWhiteSpace(opencall.Priority))
    opencall.Priority = "Default value";
...

我只是想知道,有什么扩展方法可以做到这一点吗?

【问题讨论】:

  • 你可以使用空合并运算符:x => x.Priority ?? ""
  • 正如我提到的,我只是想这样做,我们如何使用像 Def​​aultIfEmpty 这样的扩展方法来做到这一点。顺便说一句,非常感谢你:)
  • DefaultIfEmpty 是关于序列为空,而不是为每个元素提供默认值。既然已经有 C# 运算符,为什么还要扩展方法?

标签: c# linq


【解决方案1】:

您可以使用相同的DefaultOrEmpty 方法重载来提供默认值。在上面的查询中,因为我们试图获取 String 类型的 Priority 属性。您可以在方法重载中提供 String 的默认值:-

opencall.Priority = averages.Where(x => x.ProblemCode == opencall.ProblemCode)
                            .Select(x => x.Priority)
                            .DefaultIfEmpty("High")
                            .Single();

这将导致High 用于不匹配的行。

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2019-04-12
    • 2013-12-08
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多