Следующий ключ в Словаре C#

Как добраться Enumerator к объекту в - Отсортированный словарь с помощью ключа?

Примечание:GetEnumerator() добирается Enumerator к первому элементу..

Но я должен добраться Enumerator к элементу с данным ключом для получения доступа к следующему использованию элементов MoveNext() например...

Править: Или способ получить доступ к следующим элементам...

Править: Я предпочитаю метод времени константы...

Спасибо

7
задан Betamoo 27 July 2010 в 10:06
поделиться

5 ответов

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

Где myKey - это ключ, который вы ищете. И вы можете использовать метод расширения OrderBy, если хотите, чтобы ключи были отсортированы.

Изменить : вы не можете делать это постоянно с помощью Dictionary / SortedDictionary. Почему бы не реализовать собственное двоичное дерево поиска (например, SortedDictionary), и у вас будет время поиска O (log n) и время O (1) .next () ?

8
ответ дан 6 December 2019 в 22:59
поделиться

Вы не можете сделать это с помощью 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.
}

Но, конечно, это не лучшая идея.

1
ответ дан 6 December 2019 в 22:59
поделиться

Если у вас установлен Framework> = 3.5, используйте SkipWhile Janus Tondering и LukeH предложили. Для более низких версий фреймворка вы должны сделать это сами (например, заполните второй словарь парами ключевых значений от вашего ключа до конца).

1
ответ дан 6 December 2019 в 22:59
поделиться
var query = yourDictionary.SkipWhile(kvp => kvp.Key != keyToFind);
foreach (var result in query)
{
    // ...
}
0
ответ дан 6 December 2019 в 22:59
поделиться

Самый простой вариант - использовать 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
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: