Enumerator
キーを使用して -Sorted- 辞書のアイテムを取得する方法は?
注:GetEnumerator()
最初の要素を取得しEnumerator
ます..
しかし、たとえばEnumerator
次の要素にアクセスするには、特定のキーを持つ要素を取得する必要があります...MoveNext()
編集:または次の要素にアクセスする方法...
編集: const timeメソッドが好きです...
ありがとう
Enumerator
キーを使用して -Sorted- 辞書のアイテムを取得する方法は?
注:GetEnumerator()
最初の要素を取得しEnumerator
ます..
しかし、たとえばEnumerator
次の要素にアクセスするには、特定のキーを持つ要素を取得する必要があります...MoveNext()
編集:または次の要素にアクセスする方法...
編集: const timeメソッドが好きです...
ありがとう
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 を使用してください。フレームワークのバージョンが低い場合は、自分で行う必要があります(キーから最後までのキーと値のペアで2番目の辞書を埋めてください)。
最も簡単なオプションは、 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;
}
}
var query = yourDictionary.SkipWhile(kvp => kvp.Key != keyToFind);
foreach (var result in query)
{
// ...
}