如何从列表中获得每5项

本文关键字:5项 列表 | 更新日期: 2023-09-27 18:20:52

我有一个包含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)的范围。。。所以我犯了这个错误。。

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

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

如何从列表中获得每5项

你可以这样做:

如果您有当前的pageNumber,并且知道您定义的每页有多少记录:recordsPerPage,那么通用查询看起来像这个

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

改用LINQ:

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

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

最好的方法是使用类似MoreLinq中的Batch方法。

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

如果您想要一种不需要线程安全的简单方法(例如,您不需要将其与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();
    }

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

您可以使用Take

lstRules.Take(5);