Как добраться Enumerator
к объекту в - Отсортированный словарь с помощью ключа?
Примечание:GetEnumerator()
добирается Enumerator
к первому элементу..
Но я должен добраться Enumerator
к элементу с данным ключом для получения доступа к следующему использованию элементов MoveNext()
например...
Править: Или способ получить доступ к следующим элементам...
Править: Я предпочитаю метод времени константы...
Спасибо
var enumerator = dictionary.Keys.SkipWhile(k => k != myKey)
Где myKey - это ключ, который вы ищете. И вы можете использовать метод расширения OrderBy, если хотите, чтобы ключи были отсортированы.
Изменить : вы не можете делать это постоянно с помощью Dictionary / SortedDictionary. Почему бы не реализовать собственное двоичное дерево поиска (например, SortedDictionary), и у вас будет время поиска O (log n) и время O (1) .next ()
?
Вы не можете сделать это с помощью Dictionary. Этого можно добиться, имея возможность доступа по индексу, поэтому вместо Dictionary можно использовать SortedList. Также вы можете взглянуть на 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.
}
Но, конечно, это не лучшая идея.
Если у вас установлен Framework> = 3.5, используйте SkipWhile Janus Tondering и LukeH предложили. Для более низких версий фреймворка вы должны сделать это сами (например, заполните второй словарь парами ключевых значений от вашего ключа до конца).
var query = yourDictionary.SkipWhile(kvp => kvp.Key != keyToFind);
foreach (var result in query)
{
// ...
}
Самый простой вариант - использовать 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;
}
}