2015-10-04 41 views
0

你知道有一个名为DefaultIfEmpty扩展方法,基于文档:返回默认值,如果一个属性为

DefaultIfEmpty

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

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

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

在这个例子中,如果平均是空的,它返回一个空字符串,但我想知道是否有像linq中的扩展方法,所以如果preperty(x.Priority)为null,返回一个默认值?

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"; 
... 

我只是好奇,想知道,是否有这样做,任何一种扩展方法吗?

+3

那么你可以使用null-coalescing运算符:'x => x.Priority ?? “”' –

+0

正如我刚才提到的那样,我们如何使用像DefaultIfEmpty这样的扩展方法来做到这一点。顺便谢谢你:) –

+0

DefaultIfEmpty是关于序列是空的,没有提供每个元素的默认值。如果已经有一个C#操作符,为什么还需要扩展方法? –

回答

0

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

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

这将导致High非匹配行。