2010-07-27 76 views
7

如何使用鍵將Enumerator轉換爲-Sorted-詞典中的項目?C#詞典中的下一個鍵

注:GetEnumerator()得到一個Enumerator到第一個元素..

但我需要得到一個Enumerator與給定鍵的元素,以獲取使用MoveNext()例如下一個元素...

編輯:或者訪問下一個元素的方式...

編輯:我更喜歡一個常量時間的方法...

感謝

回答

7
var enumerator = dictionary.Keys.SkipWhile(k => k != myKey) 

哪裏的myKey是你要找的關鍵。如果你想把鍵排序,你可以使用OrderBy擴展方法。

編輯:你不能在Dictionary/SortedDictionary中使用常量。爲什麼不實現你自己的二叉搜索樹(就像SortedDictionary一樣),你將有O(log n)時間查詢和O(1)時間.next()

1

你不能用Dictionary做到這一點。 您可以完成那些有索引訪問的可能性,因此您可以使用SortedList而不是Dictionary。你也可以看看SkipWhile

雖然你可以有一些解決辦法是這樣的:

Dictionary<int, int> dictionary = new Dictionary<int, int>(); 
foreach (KeyValuePair<int, int> pair in dictionary) 
{ 
    // you can check the key you need and assume that the next one will be what you need. 
} 

但是,當然,這是不是最好的主意。

0
var query = yourDictionary.SkipWhile(kvp => kvp.Key != keyToFind); 
foreach (var result in query) 
{ 
    // ... 
} 
1

如果你有框架> = 3.5安裝使用SkipWhile劍鋒Tondering和LukeH建議。 對於較低的框架版本,您必須爲自己完成這一工作(即使用從您的密鑰到最後的keyvalue對填充第二個字典)。

0

最簡單的選擇是使用SortedList,然後向其添加一個擴展方法,它返回一個IEnumerable,其元素大於或等於給定的鍵。下面的GetElementsGreaterThanOrEqual方法的複雜性是O(log(n))以獲得第一個元素,然後每個迭代之後是O(1)。

public static class SortedListExtension 
{ 
    public static IEnumerable<KeyValuePair<TKey, TValue>> GetElementsGreaterThanOrEqual<TKey, TValue>(this SortedList<TKey, TValue> instance, TKey target) where TKey : IComparable<TKey> 
    { 
     int index = instance.BinarySearch(target); 
     if (index < 0) 
     { 
      index = ~index; 
     } 
     for (int i = index; i < instance.Count; i++) 
     { 
      yield return new KeyValuePair<TKey, TValue>(instance.Keys[i], instance.Values[i]); 
     } 
    } 

    public static int BinarySearch<TKey, TValue>(this SortedList<TKey, TValue> instance, TKey target) where TKey : IComparable<TKey> 
    { 
     int lo = 0; 
     int hi = instance.Count - 1; 
     while (lo <= hi) 
     { 
      int index = lo + ((hi - lo) >> 1); 
      int compare = instance.Keys[index].CompareTo(target); 
      if (compare == 0) 
      { 
       return index; 
      } 
      else 
      { 
       if (compare < 0) 
       { 
        lo = index + 1; 
       } 
       else 
       { 
        hi = index - 1; 
       } 
      } 
     } 
     return ~lo; 
    } 
} 
+0

將如何使用此方法/叫什麼? – vapcguy 2016-09-22 20:30:03

0

也許這是有用的人:

public Dictionary<string, int> myDictionary = new Dictionary<string, int>(); 
public string myCurrentKey = "some key 5"; 
for (int i = 1; i <= 10; i++) { 
    myDictionary.Add(string.Format("some key {0}", i), i); 
} 

private void MoveIndex(int dir) { // param "dir" can be 1 or -1 to move index forward or backward 
    List<string> keys = new List<string>(myDictionary.Keys); 
    int newIndex = keys.IndexOf(myCurrentKey) - dir; 
    if (newIndex < 0) { 
     newIndex = myDictionary.Count - 1; 
    } else if (newIndex > myDictionary.Count - 1) { 
     newIndex = 0; 
    } 

    myCurrentKey = keys[newIndex]; 
} 

Debug.Log(string.Format("Current value: {0}", myDictionary[myCurrentKey])); // prints 5 
MoveIndex(1); 
Debug.Log(string.Format("Current value: {0}", myDictionary[myCurrentKey])); // prints 6 
MoveIndex(-1); 
MoveIndex(-1); 
Debug.Log(string.Format("Current value: {0}", myDictionary[myCurrentKey])); // prints 4