每个循环的偏移量

问题描述 投票:0回答:5

我想实现简单的分页。

我目前有一个

Dictionary
并通过使用
foreach
循环迭代它来在页面上显示其内容。
我找不到抵消
foreach
循环的方法。

假设我有 100 件商品。每页 5 项,总共 20 页。我将从以下开始:

int counter = 0;
int itemsPerPage = 5;
int totalPages = (items.Count - 1) / itemsPerPage + 1;
int currentPage = (int)Page.Request.QueryString("page"); //assume int parsing here
Dictionary<string, string> currentPageItems = new Dictionary<string, string>;

foreach (KeyValuePair<string, string> item in items) //items = All 100 items
{
    //---Offset needed here----
    currentPageItems.Add(item.Key, item.Value);
    if (counter >= itemsPerPage)
        break;
    counter++;
}

这将正确输出第一页 - 现在如何显示后续页面?

c# dictionary foreach pagination
5个回答
4
投票

借助LINQ,可以使用

Skip
Take
轻松实现分页。

var currentPageItems = items.Skip(itemsPerPage * currentPage).Take(itemsPerPage);

3
投票

假设第一页 = 第 1 页:

var currentPageItems =
    items.Skip(itemsPerPage * (currentPage - 1)).Take(itemsPerPage)
    .ToDictionary(z => z.Key, y => y.Value);

请注意,技术上这并不是万无一失的,因为,如http://msdn.microsoft.com/en-us/library/xfhwa508.aspx所述:

For purposes of enumeration, each item in the dictionary is treated as a KeyValuePair(Of TKey, TValue) structure representing a value and its key. The order in which the items are returned is undefined.

因此,“理论上”,即使不对字典进行任何更改,前 10 个项目的同一请求也可能返回一组不同的 10 个项目。实际上,这似乎不会发生。但是,例如,不要期望对词典的任何添加都会添加到最后一页。


1
投票

Skip

Take
 扩展方法来执行此操作...
using System.Linq ... var itemsInPage = items.Skip(currentPage * itemsPerPage).Take(itemsPerPage) foreach (KeyValuePair<string, string> item in itemsInPage) { currentPageItems.Add(item.Key, item.Value); }



1
投票

Skip()

Take()
:
foreach(var item in items.Skip(currentPage * itemsPerPage).Take(itemsPerPage)) { //Do stuff }



1
投票
List<KeyValuePair>

(显然创建列表将迭代字典的所有元素,但可能只能这样做一次)。


然后就可以像这样使用:

var dictionary = new Dictionary<string, string>(); var list = dictionary.ToList(); var start = pageNumber*pageSize; var end = Math.Min(list.Count, start + pageSize); for (int index = start; index++; index < end) { var keyValuePair = list[index]; }

	
© www.soinside.com 2019 - 2024. All rights reserved.