我有以下代码输出导航栏的一系列链接:
<% foreach (var item in (Dictionary<string, string>)ViewData["navItems"])
{
Response.Write(Html.ActionLink(item.Key, item.Value));
}
%>
无论如何要更改此代码,以便以相反的顺序输出链接列表?
我有以下代码输出导航栏的一系列链接:
<% foreach (var item in (Dictionary<string, string>)ViewData["navItems"])
{
Response.Write(Html.ActionLink(item.Key, item.Value));
}
%>
无论如何要更改此代码,以便以相反的顺序输出链接列表?
您可以使用Enumerable.Reverse
方法(此处的文档):
var dic = (Dictionary<string, string>)ViewData["navItems"];
foreach (var item in dic.Reverse())
{
Response.Write(Html.ActionLink(item.Key, item.Value));
}
或老派解决方案:将您的 foreach 循环更改为从最后一项开始的循环,递减索引..
您应该在这里注意的重要一点是 Dictionary 中项目的顺序是不确定的。虽然您现在看到的是特定订单,但不能保证 Hashtables(其中 Dictionary 是其中的一个)。因此,即使您使用一种方法来反转顺序,您也无法保证将来会使用该顺序,并且您可能会在解决方案中遇到计划外的结果。
出于枚举的目的,字典中的每个项目都被视为表示值及其键的 KeyValuePair 结构。返回项目的顺序未定义。
我的建议是不要直接枚举 Dictionary ,而是以保证顺序的形式获取您想要的值,例如 List<> 并在那时对它们进行排序,然后在您的列表中枚举应用。
我不确定您是否要对其进行排序。如果你这样做,你可以使用以下内容。如果你只是想要它反转 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);
}