ASP MVC - 逆转一个foreach

时间:2012-11-03 14:35:16

标签: asp.net asp.net-mvc

我有以下代码输出导航栏的一系列链接:

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

无论如何都要改变这段代码,以便以相反的顺序输出链接列表?

3 个答案:

答案 0 :(得分:8)

您可以使用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周期更改为从最后一项开始的循环,递减索引..

答案 1 :(得分:5)

您应该注意的重要事项是,词典中的项目顺序为non-deterministic。当您现在看到特定订单时,不保证Hashtables(其中包含Dictionary)。因此,即使您使用某种方法来撤消订单,您也不能保证将来会有该订单,并且您可能会在解决方案中遇到意外结果。

  

出于枚举的目的,字典中的每个项都被视为   表示值及其值的KeyValuePair结构   键。返回项目的顺序未定义。

我的建议是不直接枚举字典,而是以保证顺序的形式获取所需的值,例如List&lt;&gt;并在那时对它们进行排序,然后在您的应用程序中列出该列表。

答案 2 :(得分: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);
}