【发布时间】:2011-01-06 20:58:46
【问题描述】:
一个方法返回一个序列IEnumerable<T>,你现在想检查它是否为空。你如何建议这样做?我正在寻找良好的可读性和良好的性能。
第一个也是最明显的方法是检查计数是否大于零:
if(sequence.Count() == 0)
具有不错的可读性,但性能很差,因为它实际上必须遍历整个序列。
我有时使用的一种方法如下:
if(!sequence.Any())
这并不(据我所知)必须遍历整个序列,但可读性有点倒退和尴尬。 (如果我们检查序列是否为 not 空的话会更好读)。
另一种选择是在 try-catch 中使用 First,如下所示:
try
{
sequence.First();
}
catch(InvalidOperationException)
{
// Do something
}
不是一个非常漂亮的解决方案,而且可能也更慢,因为它使用了异常和东西。当然可以通过使用FirstOrDefault 来防止这种情况发生,除非如果序列中的第一项实际上是默认值,你会遇到一个大问题;)
那么,还有其他方法可以检查序列是否为空吗?你通常使用哪一种?您推荐使用哪一种?
注意:为了获得最佳可读性,我可能会将上述 sn-ps 之一放在 IsEmpty 扩展方法中,但我仍然很好奇,因为我会在该方法中也做一些事情:p
【问题讨论】:
-
sequence是什么类型? -
@Beska:如果序列没有实现
ICollection<T>,它只是迭代。请参阅文档:msdn.microsoft.com/en-us/library/bb338038.aspx -
@Neil: IEnumerable
。我想应该在某个地方注意到这一点。编辑:)
标签: c# linq ienumerable