一个方法返回一个序列,IEnumerable<T>
,现在你想检查它是否为空。你建议怎么做?我希望既易读性好又性能好。
第一种最明显的方式是检查计数是否大于零:
if(sequence.Count() == 0)
虽然易读性较好,但由于必须遍历整个序列,因此性能很差。
我有时使用以下方法:
if(!sequence.Any())
据我所知,这个过程不必完全进行,但可读性有点反向和笨拙(如果我们检查的序列是非空的,则读起来要好得多)。
另一个选择是在try-catch中使用First
,像这样:
try
{
sequence.First();
}
catch(InvalidOperationException)
{
// Do something
}
这并不是一种非常漂亮的解决方案,而且可能会更慢,因为它使用了异常等内容。当然,可以通过使用FirstOrDefault
来防止这种情况,但如果序列中的第一个项目实际上是默认值,那么你将面临一个大问题;)
那么,有没有其他方法来检查序列是否为空?你通常使用哪种方法?你推荐使用哪种方法?
注意:为了最佳可读性,我可能会将上述其中一个代码片段放在IsEmpty
扩展方法中,但我仍然很好奇,因为我还需要在该方法内部执行某些操作: p
sequence
是什么类型? - Neil BarnwellICollection<T>
,它只是通过迭代来实现。请参阅文档:http://msdn.microsoft.com/zh-cn/library/bb338038.aspx - Jon Skeet