web-dev-qa-db-ja.com

C#のOrderedDictionaryからインデックスでキーを取得するにはどうすればよいですか?

OrderedDictionaryからインデックスでアイテムのキーと値を取得するにはどうすればよいですか?

24
Red Swan

これを行うための直接的な組み込みの方法はありません。これは、OrderedDictionaryの場合、インデックスisキーであるためです。実際のキーが必要な場合は、自分で追跡する必要があります。おそらく最も簡単な方法は、キーをインデックス可能なコレクションにコピーすることです。

// dict is OrderedDictionary
object[] keys = new object[dict.Keys.Count];
dict.Keys.CopyTo(keys, 0);
for(int i = 0; i < dict.Keys.Count; i++) {
    Console.WriteLine(
        "Index = {0}, Key = {1}, Value = {2}",
        i,
        keys[i],
        dict[i]
    );
}

この動作を、OrderedDictionaryへのアクセスをラップする新しいクラスにカプセル化できます。

9
jason
orderedDictionary.Cast<DictionaryEntry>().ElementAt(index);
46
Martin R-L

前述のコードを使用して、インデックスごとにキーを取得し、キーごとに値を取得する拡張メソッドをいくつか作成しました。

public static T GetKey<T>(this OrderedDictionary dictionary, int index)
{
    if (dictionary == null)
    {
        return default(T);
    }

    try
    {
        return (T)dictionary.Cast<DictionaryEntry>().ElementAt(index).Key;
    }
    catch (Exception)
    {
        return default(T);
    }
}

public static U GetValue<T, U>(this OrderedDictionary dictionary, T key)
{
    if (dictionary == null)
    {
        return default(U);
    }

    try
    {
        return (U)dictionary.Cast<DictionaryEntry>().AsQueryable().Single(kvp => ((T)kvp.Key).Equals(key)).Value;
    }
    catch (Exception)
    {
        return default(U);
    }
}
2
Halcyon