2012-11-03 22 views
2

我有下面的代碼輸出用於導航欄,一系列鏈接:ASP MVC - 逆向一個foreach

<% foreach (var item in (Dictionary<string, string>)ViewData["navItems"]) 
     { 
     Response.Write(Html.ActionLink(item.Key, item.Value)); 
     } 
    %> 

反正是有改變這種代碼,以便鏈接列表是按相反的順序輸出?

回答

6

您可以使用Enumerable.Reverse方法(文檔here):

var dic = (Dictionary<string, string>)ViewData["navItems"]; 

foreach (var item in dic.Reverse()) 
{ 
    Response.Write(Html.ActionLink(item.Key, item.Value)); 
} 

或者老同學的解決方案:改變你的foreach循環的循環開始的最後一個項目,遞減指數..

5

東西重要的是你這裏應該注意的是,字典中的項目順序是non-deterministic。雖然您現在看到特定訂單,但無法保證散列表(其中包含字典)。因此,即使您使用某種方法來反轉訂單,您也無法保證未來訂單的順利發展,並且您可能會在解決方案中遇到意外的結果。

對於枚舉的目的,字典中的每個項被視爲 表示值和其 密鑰的KeyValuePair結構。項目返回的順序是未定義的。

我的建議是不要在字典枚舉直接,但是,相反,讓你在保證順序,如List <的東西形式所需的值>和他們當時進行排序,然後在應用程序中列舉該列表。

2

我不確定您是否想對它進行排序。如果你這樣做,你可以使用以下。如果你只是想它顛倒Reverse()就是你想要的。

這給你在鍵上的倒序的列表。您可以將c.Key更改爲c.Value,如果您想要按值的順序遍歷列表。

var dict = new Dictionary<string, string>() {{"a", "1"}, {"b", "2"}, {"c", "3"}}; 

foreach (var keyValuePair in dict.OrderByDescending(c => c.Key)) 
{ 
    Console.WriteLine(keyValuePair.Value); 
}