在null IEnumerables上为Count()返回零

Pro*_*ofK 14 .net c# collections

我厌倦了使用这样的代码:

var count = 0;
if (myEnumerable != null)
{
    count = myEnumerable.Count();
}
Run Code Online (Sandbox Code Playgroud)

这有点迂腐:

var count = (myEnumerable ?? new string[0]).Count();
Run Code Online (Sandbox Code Playgroud)

这样做有什么比较整洁的方法吗?我曾经在IEnumerable <>上使用了一个(命名很差的)PhantomCount扩展方法,它使用了我的第一个代码示例,但它有一些关于它的气味(除了名称).

Ano*_*on. 32

问题实际上在于创建这些枚举的任何内容.除非你有充分的理由,否则任何生成可迭代集合的东西都应该返回一个空集合而不是null.这将与Null-Object-Pattern对齐,因此好处是相同的.

我的建议是修复任何产生myEnumerable,或者如果你不能做到这一点,请提前添加一个检查方法,看它是否为空并做出适当的反应.


cor*_*erm 14

怎么样

count = myEnumerable == null? 0 : myEnumerable.Count()
Run Code Online (Sandbox Code Playgroud)

  • 我有一种感觉,他会要求比这更整洁,+1 仍然 :) (2认同)

Che*_*hen 9

我不认为使用扩展方法是个坏主意.

public static int NullableCount<T>(this IEnumerable<T> collection)
{
   return collection == null ? 0 : collection.Count();
}
Run Code Online (Sandbox Code Playgroud)

  • +1 我做了完全一样的东西——只是将它命名为“CountOrZero”。个人觉得比较清楚。 (2认同)

Lic*_*cht 7

2019 年,最简洁的方法是var count = myEnumerable?.Count() ?? 0;

2021年编辑:

public int CountNullable<T>(this IEnumerable<T>? enumerable) =>
    enumerable?.Count() ?? 0;
Run Code Online (Sandbox Code Playgroud)


Tho*_*que 5

我使用自定义扩展方法:

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source)
{
    return source ?? Enumerable.Empty<T>();
}

...

int count = myEnumerable.EmptyIfNull().Count();
Run Code Online (Sandbox Code Playgroud)