我想实现简单的分页。
我目前有一个
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++;
}
这将正确输出第一页 - 现在如何显示后续页面?
假设第一页 = 第 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 个项目。实际上,这似乎不会发生。但是,例如,不要期望对词典的任何添加都会添加到最后一页。
和
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);
}
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];
}