【问题标题】:how to iterate a dictionary<string,string> in reverse order(from last to first) in C#?如何在 C# 中以相反的顺序(从最后一个到第一个)迭代字典<string,string>?
【发布时间】:2012-04-16 11:40:20
【问题描述】:

我有一个字典,并在上面添加了一些元素。例如,

Dictionary<string, string> d = new Dictionary<string, string>();

d.Add("Content","Level0");
d.Add("gdlh","Level1");
d.Add("shows","Level2");
d.Add("ytye","Level0");

在 C# 中,字典以自然顺序保持元素。但我现在想从最后一个到第一个迭代这些值(即,反向顺序)。我的意思是,

首先我想阅读 ytye,然后是节目、gdlh,最后是内容。

请指导我摆脱这个问题...

【问题讨论】:

  • 您声明 “在 C# 中,Dictionary 使元素保持自然顺序”。这是不正确的。 The remarks section 声明 “项目返回的顺序未定义。”
  • @Daniel Hilgarth 这是我最初的想法,我这样评论,但因为我测试了一些代码并且它有效,所以将其删除。所以我做了更多的研究。最终,如果它强制字典调整大小,元素可能会在插入过程中重新排序。 SortedDictionary 是指键的顺序,但你可以给它一个比较器...... OrderedDictionary 是非泛型的,但可能是他需要的。
  • 我曾经为此争论过一次——虽然标准字典中枚举条目的“顺序”基本上是你输入它们的顺序,但这不是保证行为!假设情况总是如此是非常不明智的。

标签: c# c#-4.0


【解决方案1】:

只需使用Linq扩展方法Reverse

例如

foreach( var item in d.Reverse())
{
    ...
}

【讨论】:

    【解决方案2】:

    使用 LINQ Reverse,但请注意,不会原地反转

    var reversed = d.Reverse();
    

    但请注意,这不是SortedDictionary,因此不一定首先保证顺序。也许你想要OrderByDescending

    【讨论】:

    • +1 表示不保证字典中的顺序。
    【解决方案3】:

    也许OrderByDescending 在钥匙上。像这样:

    d.OrderByDescending (x =>x.Key)
    

    Foreach 像这样:

    foreach (var element in d.OrderByDescending (x =>x.Key))
    {
    
    }
    

    【讨论】:

      【解决方案4】:

      在 Linq 中可用:d.Reverse()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        相关资源
        最近更新 更多