2010-02-09 2 views

Antwort

10

Es gibt keine direkte eingebaute Möglichkeit, dies zu tun. Dies liegt daran, dass der Schlüssel OrderedDictionary der Index ist; Wenn Sie den eigentlichen Schlüssel möchten, müssen Sie ihn selbst verfolgen. Wahrscheinlich ist der direkteste Weg ist, um die Schlüssel zu einer Wende Sammlung zu kopieren:

// 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] 
    ); 
} 

Sie können dieses Verhalten in eine neue Klasse kapseln, die den Zugriff auf die OrderedDictionary wickelt.

+1

Ich habe gleich, aber sehen einmal: OrderedDictionary list = Orderitems; Objekt strKey = Liste [e.OldIndex]; DictionaryEntry dicEntry = new DictionaryEntry(); foreach (DictionaryEntry DE in Liste) { if (DE.Value == strKey) { dicEntry.Key = DE.Key; dicEntry.Value = DE.Value; } } –

+0

@RedSwan: Wo ist der Index? – testing

+2

Der Index ist definitiv * nicht * der Schlüssel - das sind notwendigerweise verschiedene Konstrukte in einem '' OrderedDictionary''. – Conrad

35
orderedDictionary.Cast<DictionaryEntry>().ElementAt(index); 
+1

Sie verdienen mehr upvotes – Seb

+1

mit 'using System.Linq;' – testing

+0

Mit diesem Code erhalten Sie das Element. Aber wie bekomme ich den Schlüssel und den Wert wie in der SO-Frage? – testing

1

Ich habe einige Erweiterungsmethoden erstellt, die den Schlüssel per Index und den Wert per Schlüssel unter Verwendung des zuvor erwähnten Codes erhalten.

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); 
    } 
} 
+0

Wenn Sie beabsichtigen, Standardwerte zurückzugeben, wenn der Zielindex/Schlüssel nicht im Wörterbuch enthalten ist, haben Sie einen teuren Weg gewählt TU es. Ausnahmen sind im Vergleich zu normalen Kontrollflusskonstrukten wie if/else sehr teuer. Es wäre viel besser, nach Out-of-Bound-Indizes und nicht vorhandenen Schlüsseln zu suchen, als sich auf eine Ausnahme zu verlassen. – Odrade