2010-02-09 24 views

Respuesta

10

No hay una forma directa incorporada de hacerlo. Esto se debe a que para un OrderedDictionary el índice es la clave; si quieres la clave real, entonces necesitas rastrearla tú mismo. Probablemente la forma más sencilla es copiar las claves de una colección indexable:

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

Usted puede encapsular este comportamiento en una nueva clase que envuelve el acceso a la OrderedDictionary.

+1

yo mismo, pero veo una vez: lista de artículos de pedido = OrderedDictionary; objeto strKey = list [e.OldIndex]; DictionaryEntry dicEntry = new DictionaryEntry(); foreach (DictionaryEntry DE en la lista) if { dicEntry.Key = DE.Key ;, (DE.Value == strKey) dicEntry.Value = DE.Value; } } –

+0

@RedSwan: ¿Dónde está el índice? – testing

+2

El índice es definitivamente * no * la clave; ésas son necesariamente construcciones distintas en un '' OrderedDictionary''. – Conrad

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

Usted señor merece más votos ascendentes – Seb

+1

usando 'using System.Linq;' – testing

+0

Con este código obtiene el elemento. ¿Pero cómo obtengo la clave y el valor como en la pregunta SO? – testing

1

Creé algunos métodos de extensión que obtienen la clave por índice y el valor por clave utilizando el código mencionado anteriormente.

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

Si su intención es devolver valores predeterminados si el índice/clave de destino no está en el diccionario, ha elegido una forma costosa de hazlo. Las excepciones son muy caras en relación con las construcciones normales de flujo de control como if/else. Sería mucho mejor verificar los índices fuera de límites y las claves no existentes que confiar en que ocurra una excepción. – Odrade

Cuestiones relacionadas