【发布时间】:2016-06-06 10:16:35
【问题描述】:
在使用 Linq 扩展时,看到这样的代码是很正常的:
IEnumerable<int> enumerable = GetEnumerable();
int sum = 0;
if (enumerable != null)
{
sum = enumerable.Sum();
}
为了提高代码质量,我编写了以下扩展方法,用于检查可空枚举并中断 linq 执行。
public static IEnumerable<T> IgnoreIfEmpty<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null) yield break;
foreach (var item in enumerable)
{
yield return item;
}
}
所以,我可以将代码重构为:
var sum = GetEnumerable().IgnoreIfEmpty().Sum();
我现在的问题:
- 我的扩展方法在运行时会受到哪些处罚?
- 以这种方式扩展 linq 是一种好习惯吗?
更新: 我的目标框架是:3.5
【问题讨论】:
-
IgnoreIfEmpty不是一个好名字,因为“忽略”是模糊的,空的可枚举与空的不同。 -
如果您可以控制
GetEnumerable方法,您应该返回空集合而不是 null。 -
如果它是空的,那不是忽略它;它将 null 转换为空序列。你应该叫它
EmptyIfNull()或类似的名字。 -
我使用了类似的 EmptyIfNull 方法,它似乎符合 DefaultIfEmpty 的命名风格
-
@msa 我认为返回 null 代替可枚举是出乎意料的。 MS指南同意msdn.microsoft.com/en-us/library/dn169389(v=vs.110).aspx