如何在Linq中使用Long类型跳过

时间:2015-08-31 11:06:35

标签: c# linq

如何在Linq中使用Skip的long类型(Int64)。它仅支持Int32。

dataContext.Persons.Skip(LongNumber);

2 个答案:

答案 0 :(得分:5)

您可以使用while循环:

// Some init
List<Person> persons = new List<Person>();
List<Person> resultList = persons;
long bigNumber = 3 * (long)int.MaxValue + 12;

while (bigNumber > int.MaxValue)
{
    resultList = resultList.Skip(int.MaxValue).ToList();
    bigNumber -= int.MaxValue;
}
resultList = resultList.Skip(int.MaxValue).ToList();
// Then what do what you want with this result list

但您的收藏集是否超过int.MaxValue个条目?

答案 1 :(得分:1)

以下扩展方法 BigSkip 允许跳过超过 LINQ 的 Int32.MaxValue 方法的 Skip 最大值,方法是多次调用该方法直到达到 long 值。这种方法的优点是不会过早地导致集合迭代。

示例用法

bigCollection.BigSkip(howMany: int.MaxValue + 1l)

方法

using System;
using System.Collections.Generic;
using System.Linq;

static public class LinqExtensions
{
    static public IEnumerable<T> BigSkip<T>(this IEnumerable<T> items, long howMany)
        => BigSkip(items, Int32.MaxValue, howMany);

    internal static IEnumerable<T> BigSkip<T>(this IEnumerable<T> items, int segmentSize, long howMany)
    {
        long segmentCount = Math.DivRem(howMany, segmentSize,
            out long remainder);

        for (long i = 0; i < segmentCount; i += 1)
            items = items.Skip(segmentSize);

        if (remainder != 0)
            items = items.Skip((int)remainder);

        return items;
    }

}

该方法已分为两种:internal 重载是为了方便起见,允许指定比 Int32.MaxValue 更小的段大小,以使其可在较小规模上进行单元测试。

奖金

Skip 替换为 Take 以创建 BigTake 方法;相同的扩展方法模式可用于扩展其他 LINQ 方法的范围。