如何从列表中获得每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)
的范围。。。所以我犯了这个错误。。
我的问题是如何解决这个问题?
有没有其他方法可以从列表中获取数据?
你可以这样做:
如果您有当前的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);