4

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

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

无论如何要更改此代码,以便以相反的顺序输出链接列表?

4

3 回答 3

8

您可以使用Enumerable.Reverse方法(此处的文档):

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

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

或老派解决方案:将您的 foreach 循环更改为从最后一项开始的循环,递减索引..

于 2012-11-03T14:37:25.610 回答
5

您应该在这里注意的重要一点是 Dictionary 中项目的顺序是不确定的。虽然您现在看到的是特定订单,但不能保证 Hashtables(其中 Dictionary 是其中的一个)。因此,即使您使用一种方法来反转顺序,您也无法保证将来会使用该顺序,并且您可能会在解决方案中遇到计划外的结果。

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

我的建议是不要直接枚举 Dictionary ,而是以保证顺序的形式获取您想要的值,例如 List<> 并在那时对它们进行排序,然后在您的列表中枚举应用。

于 2012-11-03T14:45:33.357 回答
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);
}
于 2012-11-03T14:57:15.190 回答