在C#中,我经常需要做这件事
if(x.Items!=null && x.Items.Any())
{ .... }
在集合上有没有快捷方式?
C# 6中,您将能够编写:
if (x.Items?.Any() == true)
在那之前,你总是可以编写自己的扩展方法:
public static bool NotNullOrEmpty<T>(this IEnumerable<T> source)
{
return source != null && source.Any();
}
那么只需使用:
if (x.NotNullOrEmpty())
将名称更改以适合您的口味,例如NullSafeAny
可能更符合您的口味 - 但我肯定会在名称中明确指出,即使x
为null也是有效的调用。
x.Items?.Any()
的类型是 Nullable<bool>
,所以你需要在这里加上 == true
- 这意味着如果 x.Items
返回 null
,条件将 不会 满足。这与 if (x.Items?.Any != false)
不同,如果 x.Items
为 null,则结果将为 null,它不等于 false,所以条件将被满足。 - Jon Skeet== true
语句。而且那个 (myVar?.Any()).HasValue
也让我感觉不对劲。我个人更喜欢写得更详细一些,但阅读起来更容易。 - Sergey Zykovpublic static bool NotNullOrEmpty<T>(this IEnumerable<T> source)
{
return source != null && !source.All(x => x == null);
}
DoThis()
将永远不会被调用。想象一下,您的列表来自数据库,而null
值意味着“此订单未付款”,因此您“可能”需要对null
值采取行动(这不是最好的例子,但说明了问题)。对于某些实现,空值可能意味着某些内容...正如我所说,如果它适用于-您-的类型,那么很好,但作为-通用-实现,它具有潜在的缺点。 - JclNotNullAndAnyHasValue()
或其他名称,但我不会用这个替换其他扩展方法。 - Jcl
string Foo()
的结果类型是否为string
? :) 如果契约规定“永远不会返回null”,那么您就不应该检查null——在出现null
的情况下,唯一有效的操作是完全失败操作/进程... - Alexei Levenkov