按顺序枚举Dictionary.KeyCollection

时间:2010-12-18 15:40:24

标签: c# winforms dictionary ienumerable key

根据MSDN

  

中的键的顺序   Dictionary.KeyCollection是   未指定的

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

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

如何最好地完成这项工作?

(我正在使用Winforms,.NET 2.0)

3 个答案:

答案 0 :(得分:5)

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

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

答案 2 :(得分:0)

如果密钥是插入顺序(1,2,3,等等),也许SortedDictionary可能会执行您所需要的操作。