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

5
如果我有这样一个数组:
string[] mobile_numbers = plst.Where(r => !string.IsNullOrEmpty(r.Mobile))
                                          .Select(r => r.Mobile.ToString())
                                          .ToArray();

我希望对这个数组进行分页,并根据这些页面进行循环。

假设这个数组有400个元素,我想要取出前20个接着再取20个,以此类推,直到处理完整个数组的每20个元素。

如何使用Linq实现这一操作?


1
有一种很酷的方法叫做 "Take",用于那种情况。 - Mikey Mouse
请查看https://dev59.com/fXRC5IYBdhLWcg3wD87r。 - Davio
3个回答

20

使用SkipTake方法进行分页(但要记住,每次获取一页时都会迭代集合):

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

如果你只需要将数组分成“页”,那么考虑使用MoreLinq(可以从NuGet获取)的Batch方法:
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
}

如何获取页面编号?我需要在循环中使用这个方法对吗? - Anyname Donotcare
@just_name,你应该提供所需页面的页码。如果你需要将数组分割成桶,请考虑使用MoreLinq批处理方法。 - Sergey Berezovskiy
如何确定页码,你是否将400/20除以得到循环的限制? - Anyname Donotcare
@MatthewWatson 这就是为什么我建议使用批处理的原因。 - Sergey Berezovskiy
我使用Visual Studio 2008,我希望它简单一些,只需要一个简单的循环,我想要限制循环的次数。 - Anyname Donotcare
显示剩余3条评论

2

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

MoreLinq 中有一个可供使用的批处理操作符

您可以像以下这样使用它(用于您的示例):

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

在上面的循环中,batch将是最多20个项目的IEnumerable(最后一个批次可能小于20;所有其他批次的长度都为20)。

1
你可以使用.Skip(n).Take(x);跳过当前索引并取出所需数量。
当可用数量少于请求的数量时,Take仅会取走剩余的数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接