如何使用 LINQ 对数组进行分页?

Posted

技术标签:

【中文标题】如何使用 LINQ 对数组进行分页?【英文标题】:How to page an array using LINQ? 【发布时间】:2013-06-09 15:58:37 【问题描述】:

如果我有这样的数组:

string[] mobile_numbers = plst.Where(r => !string.IsNullOrEmpty(r.Mobile))
                                          .Select(r => r.Mobile.ToString())
                                          .ToArray();

我想分页这个数组并根据这些页面循环。

假设数组计数是400,我想取the first 20,然后是the second 20,依此类推,直到数组结束处理每个20 项目。

如何用 linq 做到这一点? .

【问题讨论】:

有一个很酷的方法叫做 Take 来处理那种事情 看看***.com/questions/419019/… 【参考方案1】:

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

int pageSize = 20;
int pageNumber = 2;
var result = mobile_numbers.Skip(pageNumber * pageSize).Take(pageSize);

如果您只需要在“页面”上拆分数组,请考虑使用MoreLinq(可从 NuGet 获得)批处理方法:

var pages = mobile_numbers.Batch(pageSize);

如果您不想使用整个库,请查看Batch method implementation。或者使用这个扩展方法:

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

【讨论】:

如何获取页码?我在循环中使用这个方法对吗? @just_name 你应该为你想要的页面提供页码。如果您需要在存储桶上拆分数组,请考虑使用 MoreLinq Batch 方法 如何得出页码,你是不是除以400/20得到循环的限制?? for(int i =0 i&lt;20;i++) @just_name 与你做的批次foreach(var page in pages)【参考方案2】:

您需要一个批处理操作员。

There is one in MoreLinq that you can use.

你会像这样使用它(例如):

foreach (var batch in mobile_numbers.Batch(20))
    process(batch);

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

【讨论】:

【参考方案3】:

您可以使用.Skip(n).Take(x); 跳转到当前索引并取所需数量。

Take 只会在可用的数量少于请求的数量时获取可用的数量,即剩余的数量。

【讨论】:

以上是关于如何使用 LINQ 对数组进行分页?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 对集合进行分页

如何使用聚合在猫鼬中对文档数组进行分页?

ThinkPHP5如何对数组进行分页

VueJs:如何使用加载更多按钮对数组项进行分页

将数组存储为逗号分隔,如何使用 LINQ 进行查询?

使用 MongoDB .Net 驱动程序对存储在文档字段中的数组进行分页