如何从列表中获取每5个项目

时间:2013-07-03 09:04:27

标签: c# linq list collections

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

我需要从列表中获取每5件物品

我尝试的代码:

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

IF CurrentPage = 1 and Pagesize = 5然后aove代码正常工作,因为在这里我传递范围为(0,5)......

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

您可以这样做:

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

var currentPageData = lstRules.ToList().
                          Skip(pageNumber * recordsPerPage).Take(recordsPerPage);

答案 1 :(得分:2)

改用LINQ:

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

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

答案 2 :(得分:1)

执行此操作的最佳方法是使用the Batch method from 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方法。

答案 3 :(得分:0)

您可以使用Take

lstRules.Take(5);