【问题标题】:Enumerating through a Dictionary.KeyCollection in order按顺序通过 Dictionary.KeyCollection 枚举
【发布时间】:2011-05-27 14:16:38
【问题描述】:

根据MSDN

键的顺序 Dictionary.KeyCollection 是 未指定

我假设这是因为对字典的添加被放入了某种哈希表中。

但是,我想将 Dictionary 中的 .Keys 集合作为方法中的 IEnumerable(或者可能作为 ICollection)返回,并按照它们最初添加到 Dictionary 的顺序对它们进行枚举。

如何最好地做到这一点?

(我使用的是 Winforms,.NET 2.0)

【问题讨论】:

    标签: c# winforms dictionary ienumerable key


    【解决方案1】:

    然后将密钥单独保存在List<T> 中。字典中不再存在该原始顺序。该列表将重复插入顺序。

    【讨论】:

    • 我考虑过使用另一个 List ,但如果没有必要,这似乎是重复,我想知道字典中是否缺少任何东西。但是,如果这确实是这样做的方法,那么没问题,谢谢。
    【解决方案2】:

    您可以使用List<KeyValuePair<K,V>> 代替Dictionary<K,V> 来维持秩序。当然,这样做的问题是更新键的值变得更加困难,而且您可以拥有重复的键。但这可以通过这些扩展方法来处理

        public static void AddOrUpdate<K, V>(this List<KeyValuePair<K, V>> list, K key, V value)
        {
            var pair = list.SingleOrDefault(kvp => kvp.Key.Equals(key));
            if (!pair.Equals(null))
                list.Remove(pair);
            list.Add(new KeyValuePair<K, V>(key, value));
        }
    
        public static V GetValue<K, V>(this List<KeyValuePair<K, V>> list, K key)
        {
            var pair = list.SingleOrDefault(kvp => kvp.Key.Equals(key));
            if (pair.Equals(null))
                return default(V); //or throw an exception
            return pair.Value;
        }
    
        public static bool ContainsKey<K, V>(this List<KeyValuePair<K, V>> list, K key)
        {
            return list.Any(kvp => kvp.Key.Equals(key));
        }
    

    【讨论】:

    • 感谢您的回复,它会起作用,但我需要确保我添加的每个 Key 的唯一性。 List.Contains 不如 Dictionary.ContainsKey 性能好,尤其是如果有很多我不认为的项目。
    • @Andy 是的,这并不理想,但与保留单独的键列表相比,这是另一种选择。
    【解决方案3】:

    如果关键是插入顺序(1、2、3...等),SortedDictionary 可能会满足您的需求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多