4

如果我有这样的数组:

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 做到这一点?.

4

3 回答 3

17

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

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

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

var pages = mobile_numbers.Batch(pageSize);

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

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
}
于 2013-06-13T09:56:16.547 回答
2

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

MoreLinq 中有一个您可以使用

你会像这样使用它(对于你的例子):

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

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

于 2013-06-13T10:01:30.073 回答
1

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

Take当可用的数量少于请求的数量时,只会采用可用的数量,即剩下的数量。

于 2013-06-13T09:56:45.550 回答