如何在Linq中使用Skip的long类型(Int64)。它仅支持Int32。
dataContext.Persons.Skip(LongNumber);
答案 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 方法的范围。