C# 可计量的LongTake和LongKip方法

C# 可计量的LongTake和LongKip方法,c#,entity-framework,linq,C#,Entity Framework,Linq,为什么IQueryable中没有LongTake和LongSkip方法 e、 g.我们有LongCount方法 对于LongTake和LongSkip方法,我应该使用哪种替代代码?不管Alexander的公正评论,我也问自己,鉴于Skip是一种扩展方法,并且您可以自己查看代码,您可以轻松地修改它并自己编写LongSkip: public static IEnumerable<TSource> LongSkip<TSource>(this IEnumerable&l

为什么IQueryable中没有
LongTake
LongSkip
方法

e、 g.我们有
LongCount
方法


对于
LongTake
LongSkip
方法,我应该使用哪种替代代码?

不管Alexander的公正评论,我也问自己,鉴于Skip是一种扩展方法,并且您可以自己查看代码,您可以轻松地修改它并自己编写
LongSkip

    public static IEnumerable<TSource> LongSkip<TSource>(this IEnumerable<TSource> source, long count) {
        if (source == null) throw Error.ArgumentNull("source");
        return SkipIterator<TSource>(source, count);
    }

    static IEnumerable<TSource> SkipIterator<TSource>(IEnumerable<TSource> source, long count) {
        using (IEnumerator<TSource> e = source.GetEnumerator()) {
            while (count > 0 && e.MoveNext()) count--;
            if (count <= 0) {
                while (e.MoveNext()) yield return e.Current;
            }
        }
    }
公共静态IEnumerable LongSkip(此IEnumerable源,长计数){
if(source==null)抛出错误.ArgumentNull(“source”);
返回SkipIterator(源、计数);
}
静态IEnumerable Skiperator(IEnumerable源,长计数){
使用(IEnumerator e=source.GetEnumerator()){
而(计数>0&&e.MoveNext())计数--;

如果(count)(我认为20多亿)对于take&skip方法来说已经足够了,那么为什么需要它呢?这完全取决于您的查询提供程序。Noctis提供的答案对于LINQ to Objects是有效的,但是如果(例如)您正在查询数据库提供程序,并且希望跳过过去的30亿行,那么它将不起作用。(即使在它工作的地方,实际使用起来也可能太慢——如果你能在一微秒内跳过一个元素,这是非常乐观的,你仍然需要36分钟才能跳过前20亿个元素。)也就是说,当你想跳过数十亿行时,可能有些事情你做得不对。找出一种方法来寻找。这将枚举“跳过的”结果也是如此,为了能够在数据库端真正做到这一点,您需要自己实现
IQueryProvider
@AlexanderDerck有一大堆关于
Skip
为何以这种方式实现的文章,我相信甚至还有一篇关于重新实现linq的skeet文章。如果您的源代码是
IL,您也可以使用索引ist
,但如果他想这样做,欢迎他加入。尽管我没有回答为什么不存在的问题,但我给了他一个选择,让他拥有自己的:)。我只是觉得你没有抓住重点。你说的是Linq to Object(你的回答是正确的),但OP说的是Linq to Entities