LINQ有两种计数枚举的方法:Count
和LongCount
。实际上,这两者之间的唯一区别是,第一个返回int
,而第二个返回long
。
我不清楚为什么要添加第二种方法。似乎唯一的用例是处理超过2B元素的枚举。对我来说,这似乎是一个错误的决定,原因如下:
int
。尝试通过将产生一个OverflowException
/OutOfMemoryException
。 LongCount
为O(n),因为IEnumerable
是惰性的。如果您有一个可枚举的3B元素,请在其上调用LongCount
,然后再次对其进行迭代(如果要使用任何值,则必须进行迭代),您将添加一个额外的3B迭代,这将是速度非常慢,并且对开发人员隐藏了ToArray
/ToList
)不支持带有2B +元素的枚举。 我在这里缺少什么吗?还是有更实际的原因添加
LongCount
?谢谢。 最佳答案
我对这个设计决策没有第一手的了解,但是我可以提供一个有根据的猜测。
该方法对IQueryable
具有明显的实用性;巨大的数据库表可以轻松地支持查询。
我希望
IQueryable<Foo> q = whatever;
long result1 = q.LongCount();
long result2 = q.AsEnumerable().LongCount();
产生相同的答案。要求内存中查询使用返回不同类型的不同方法似乎是不正确的,尤其是在实现可枚举版本非常容易的情况下。
但是就像我说的那样,这是有根据的猜测;希望真正从事此设计工作的人能加入进来。