C#中IEnumerable.Count()是否可能返回负数?
嘿,这个问题抠得挺细的,确实值得掰扯清楚!
首先得明确一个核心点:虽然IEnumerable.Count()和IEnumerable.Count(Func<TSource,Boolean>)的返回类型都是int,但在实际运行中,它们绝对不会返回负值。
原因很简单:Count方法的本质是统计集合里(或符合筛选条件的)元素数量——数量这个概念本身就不可能是负数。.NET的官方实现里,这两个方法都是从0开始累加符合条件的元素,最终返回的结果必然是非负整数。哪怕是空集合,返回的也是0,绝不会出现负数的情况。
那回到你写的代码:
IEnumerable<string> list = GetMyList(); int listCount = list.Count(); if(listCount <= 0) { DoSomething(); } else { DoSomethingElse(); }
从结果准确性来说,这段代码完全没问题——因为Count永远不会返回负数,<=0和==0的判断效果是完全一致的。不过从代码可读性和语义表达来看,直接写成if(listCount == 0)会更清晰:其他看代码的同事一眼就懂你是在判断集合是否为空,不会产生“难道这里会出现负数?”的疑惑。
另外,如果你只是想判断集合是否为空,其实还有更高效的写法:用list.Any()。因为Count需要遍历整个集合统计数量(除非集合实现了ICollection接口,此时会直接取Count属性),而Any只要找到第一个元素就会停止遍历,性能上更优,语义也更明确——“集合里有没有元素?”
最后补充一句:为什么返回类型是int而不是无符号的uint?主要是历史API设计的一致性问题,而且int的最大值(21亿+)已经足够覆盖绝大多数业务场景;如果你的集合真的可能超过这个数量,那应该用LongCount()方法返回long类型。
内容的提问来源于stack exchange,提问作者Alyssa Sallean

