0

我有一个包含 8 个项目的列表。

我需要从列表中获取每 5 个项目

我试过的代码:

lstRules.ToList()
    .GetRange(((currentPage - 1) * pageSize + 1) - 1, (currentPage * pageSize));

如果CurrentPage = 1 and Pagesize = 5那么 aove 代码正常工作,因为这里我通过了(0,5)的范围......

如果CurrentPage = 2 and PageSize = 5 然后它抛出如下错误:

“偏移量和长度超出了数组的范围或计数大于从索引到源集合末尾的元素数”

我知道发生此错误是因为我只有3列表中的项目并且我通过了(5,5)...的范围所以我收到了这个错误..

我的问题是如何解决这个问题?

有没有其他方法可以从列表中获取数据?

4

4 回答 4

6

你可以这样做:

如果您有当前pageNumber并且知道您定义的每页有多少记录:recordsPerPage,通用查询将如下所示

var currentPageData = lstRules.ToList().
                          Skip(pageNumber * recordsPerPage).Take(recordsPerPage);
于 2013-07-03T09:05:52.843 回答
2

改用 LINQ:

var data = lstRules.Skip(pageNumber * pageSize).Take(pageSize);

或者,您可以使用已经为您完成工作的库,例如PagedList

于 2013-07-03T09:05:42.750 回答
1

最好的方法是使用类似fromBatch方法MoreLinq

这使您可以将序列中的项目划分为指定大小的批次。

如果您想要一种不需要线程安全的简单方法(Parallel.ForEach()例如,您不需要使用它),那么您可以使用以下扩展方法。

它的优点是无需多次调用 Skip 即可生产所有批次:

public sealed class Batch<T>
{
    public readonly int Index;
    public readonly IEnumerable<T> Items;

    public Batch(int index, IEnumerable<T> items)
    {
        Index = index;
        Items = items;
    }
}

public static class EnumerableExt
{
    // Note: Not threadsafe, so not suitable for use with Parallel.Foreach() or IEnumerable.AsParallel()

    public static IEnumerable<Batch<T>> Partition<T>(this IEnumerable<T> input, int batchSize)
    {
        var enumerator = input.GetEnumerator();
        int index = 0;

        while (enumerator.MoveNext())
            yield return new Batch<T>(index++, nextBatch(enumerator, batchSize));
    }

    private static IEnumerable<T> nextBatch<T>(IEnumerator<T> enumerator, int blockSize)
    {
        do { yield return enumerator.Current; }
        while (--blockSize > 0 && enumerator.MoveNext());
    }
}

你像这样使用它:

    var items = Enumerable.Range(100, 510); // Pretend we have 50 items.
    int itemsPerPage = 20;

    foreach (var page in items.Partition(itemsPerPage))
    {
        Console.Write("Page " + page.Index + " items: ");

        foreach (var i in page.Items)
            Console.Write(i + " ");

        Console.WriteLine();
    }

但如果您需要线程安全分区,请使用我上面链接的 MoreLinq Batch 方法。

于 2013-07-03T09:23:31.820 回答
0

您可以使用Take.

lstRules.Take(5);
于 2013-07-03T09:05:42.340 回答