每个循环的偏移量
本文关键字:偏移量 循环 | 更新日期: 2023-09-27 18:15:51
我想实现一个简单的分页。
我目前有一个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++;
}
这将正确输出第一页 -现在我如何显示后续页面?
使用LINQ,您可以使用Skip
和Take
轻松实现分页。
var currentPageItems = items.Skip(itemsPerPage * currentPage).Take(itemsPerPage);
假设第一页=第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.
您可以使用Linq 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);
}
使用LINQ的Skip()
和Take()
:
foreach(var item in items.Skip(currentPage * itemsPerPage).Take(itemsPerPage))
{
//Do stuff
}
如果您不希望迭代某些元素只是为了获得相关索引,那么可能值得将您的项从字典中移出并移到可索引的东西中,也许是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];
}