LINQ有两种计数枚举的方法:CountLongCount。实际上,这两者之间的唯一区别是,第一个返回int,而第二个返回long

我不清楚为什么要添加第二种方法。似乎唯一的用例是处理超过2B元素的枚举。对我来说,这似乎是一个错误的决定,原因如下:

  • 大多数BCL集合都由一维数组支持,这些数组的长度保证可以适合int。尝试通过将产生一个OverflowException/OutOfMemoryException
  • LongCount为O(n),因为IEnumerable是惰性的。如果您有一个可枚举的3B元素,请在其上调用LongCount,然后再次对其进行迭代(如果要使用任何值,则必须进行迭代),您将添加一个额外的3B迭代,这将是速度非常慢,并且对开发人员隐藏了
  • 由于(1),其他LINQ操作(例如ToArray/ToList)不支持带有2B +元素的枚举。

  • 我在这里缺少什么吗?还是有更实际的原因添加LongCount?谢谢。

    最佳答案

    我对这个设计决策没有第一手的了解,但是我可以提供一个有根据的猜测。

    该方法对IQueryable具有明显的实用性;巨大的数据库表可以轻松地支持查询。

    我希望

    IQueryable<Foo> q = whatever;
    long result1 = q.LongCount();
    long result2 = q.AsEnumerable().LongCount();
    

    产生相同的答案。要求内存中查询使用返回不同类型的不同方法似乎是不正确的,尤其是在实现可枚举版本非常容易的情况下。

    但是就像我说的那样,这是有根据的猜测;希望真正从事此设计工作的人能加入进来。

    10-07 19:00