2011-11-28 86 views
3

我想實現簡單的分頁。偏移foreach循環

我目前有一個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++; 
} 

這將輸出第一頁正確的 - 現在我怎麼顯示後續頁面?

回答

2

假設第一頁=第1頁:

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

注意技術上這個ISN因爲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個項目,即使沒有任何改變到詞典中。實際上,這似乎不會發生。但是,例如,不要指望將任何新增的字典添加到最後一頁。

+0

我喜歡你的解釋,你的'.ToDictionary'擴展。另外你需要的聲譽比其他人在這裏:-) –

+0

同情投票!哇噢! :) – mjwills

+0

@moontear - 不錯的一個,我喜歡你接受最低信譽評分的人的答案。好想法。 – ColinE

3

使用LINQ,您可以使用SkipTake輕鬆實現分頁。

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

可以使用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); 
} 
1

使用LINQ的Skip()Take()

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

@downvoter:小心解釋爲什麼? –

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