C# 如何使用LINQ分页数组?

C# 如何使用LINQ分页数组?,c#,arrays,linq,pagination,C#,Arrays,Linq,Pagination,如果我有这样一个数组: string[] mobile_numbers = plst.Where(r => !string.IsNullOrEmpty(r.Mobile)) .Select(r => r.Mobile.ToString()) .ToArray(); 我想分页这个数组并根据这些页面进行循环 假设数组计数

如果我有这样一个数组:

string[] mobile_numbers = plst.Where(r => !string.IsNullOrEmpty(r.Mobile))
                                          .Select(r => r.Mobile.ToString())
                                          .ToArray();
我想分页这个数组并根据这些页面进行循环

假设数组计数为
400
,我想先取
前20个
,然后取
第二个20个
,依此类推,直到数组结束,以处理每个
20

如何使用linq来实现这一点

使用和方法进行分页(但请记住,它将为您要获取的每个页面迭代集合):

如果需要在“页面”上拆分数组,则考虑使用(从NuGET提供的批处理方法:

var pages = mobile_numbers.Batch(pageSize);
如果你不想使用整个图书馆,那就看看吧。或使用此扩展方法:

public static IEnumerable<IEnumerable<T>> Batch<T>(
     this IEnumerable<T> source, int size)
{
    T[] bucket = null;
    var count = 0;

    foreach (var item in source)
    {
        if (bucket == null)            
            bucket = new T[size];


        bucket[count++] = item;

        if (count != size)            
            continue;            

        yield return bucket;

        bucket = null;
        count = 0;
    }

    if (bucket != null && count > 0)
        yield return bucket.Take(count).ToArray();
}
您可以使用
.Skip(n).Take(x)
跳到当前索引并获取所需金额


Take
仅当可用数量少于请求数量时,才会获取可用数量,即剩余数量。

您需要批处理操作员

您可以这样使用它(例如):


batch
在上述循环中最多可包含20个项目(最后一批可能小于20个;所有其他项目的长度为20个).

有一种很酷的方法叫Take,用于这类东西。看看如何获取页码?我是否在循环中使用此方法,对吗?@just_name您应该为您想要的页面提供页码。如果需要在桶上拆分数组,那么考虑使用MulelINQ批处理方法如何结束页码,是否除以400/20以获得循环的限制??<代码>(int i=0)。i@just_name对于批处理,您可以
foreach(页面中的var页面)
public static IEnumerable<IEnumerable<T>> Batch<T>(
     this IEnumerable<T> source, int size)
{
    T[] bucket = null;
    var count = 0;

    foreach (var item in source)
    {
        if (bucket == null)            
            bucket = new T[size];


        bucket[count++] = item;

        if (count != size)            
            continue;            

        yield return bucket;

        bucket = null;
        count = 0;
    }

    if (bucket != null && count > 0)
        yield return bucket.Take(count).ToArray();
}
int pageSize = 20;
foreach(var page in mobile_numbers.Batch(pageSize))
{   
    foreach(var item in page)
       // use items
}
foreach (var batch in mobile_numbers.Batch(20))
    process(batch);