2010-12-18 59 views
5

根據MSDN枚舉通過Dictionary.KeyCollection爲了

鍵在 Dictionary.KeyCollection的順序 不確定

我假設,這是因爲增加的Dictionary被放入某種散列表中。

但是,我想從字典中將.Keys集合作爲IEnumerable(或可能作爲ICollection)從方法返回,並按它們最初添加到Dictionary中的順序進行枚舉。

如何最好地實現這一目標?

(我使用的Winforms,.NET 2.0)

回答

5

然後保持分開在List<T>。字典中不再存在原始順序。該列表將重複插入順序。

+0

我想過使用另一個列表,但如果沒有必要,這似乎是重複,並想知道是否有什麼我失蹤與字典。但是,如果確實是這樣做的話,那麼沒問題,謝謝。 – Andy 2010-12-18 15:59:37

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)); 
    } 
+0

感謝您的回覆,它會起作用,但我需要確保每個我添加的密鑰的唯一性。 List.Contains不像Dictionary.ContainsKey那樣高性能,特別是如果有很多項目我不認爲。 – Andy 2010-12-18 16:20:35

+0

@安迪是的,它不是理想的,但另一種選擇與保持一個單獨的密鑰列表。 – juharr 2010-12-18 16:27:01

+0

是的,絕對要記住,謝謝。 – Andy 2010-12-18 16:31:29

0

也許SortedDictionary可能做你需要的,如果關鍵是插入順序(1,2,3,...等)