每个循环的偏移量

本文关键字:偏移量 循环 | 更新日期: 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,您可以使用SkipTake轻松实现分页。

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.

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

您可以使用Linq SkipTake扩展方法…

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];
}