7

Enumeratorキーを使用して -Sorted- 辞書のアイテムを取得する方法は?

注:GetEnumerator()最初の要素を取得しEnumeratorます..

しかし、たとえばEnumerator次の要素にアクセスするには、特定のキーを持つ要素を取得する必要があります...MoveNext()

編集:または次の要素にアクセスする方法...

編集: const timeメソッドが好きです...

ありがとう

4

6 に答える 6

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

myKey は、探しているキーです。また、キーを並べ替えたい場合は、OrderBy 拡張メソッドを使用できます。

編集:Dictionary/SortedDictionaryでは定数ではできません。独自のバイナリ検索ツリー (SortedDictionary のようなもの) を実装してみませんか? O(log n) 時間のルックアップと O(1) 時間になり.next()ます。

于 2010-07-27T10:04:23.390 に答える
1

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.
}

しかしもちろん、これは最良のアイデアではありません。

于 2010-07-27T10:06:53.127 に答える
1

Framework >=3.5 がインストールされている場合は、SkipWhile Janus Tondering と LukeH を使用してください。フレームワークのバージョンが低い場合は、自分で行う必要があります(キーから最後までのキーと値のペアで2番目の辞書を埋めてください)。

于 2010-07-27T10:23:31.853 に答える
0

最も簡単なオプションは、 a を使用してから、要素が指定されたキー以上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;
    }
}
于 2010-07-27T15:01:05.683 に答える
0
var query = yourDictionary.SkipWhile(kvp => kvp.Key != keyToFind);
foreach (var result in query)
{
    // ...
}
于 2010-07-27T10:07:00.060 に答える