2012-05-08 10 views
5

¿Cuál es la mejor forma de navegar a través de un diccionario? Solía ​​usar el código de abajo cuando tuve IDictionary:Navegue por el diccionario <string, int> C#

Supongamos que tengo IDictionary nombrado freq

IEnumerator enums = freq.GetEnumerator(); 
while (enums.MoveNext()) 
{ 
    string word = (string)enums.Key; 
    int val = (int)enums.Value; 
    .......... and so on 

} 

pero ahora, quiero hacer lo mismo utilizando el diccionario

Respuesta

4

La instrucción foreach se repite automáticamente a través de enumeradores.

foreach (KeyValuePair<string,int> entry in freq) { 
    string word = entry.Key; 
    int val = entry.Value; 
    .......... and so on 

} 
+0

Entonces, ¿cuál sería más rápido? usando IEnumerator o foreach (KeyValuePair . porque mi diccionario contiene más de 200000 palabras. –

+2

'foreach' llama a' GetEnumerator' y 'MoveNext' internamente. Así que esto no debería hacer ninguna diferencia.Además, la variante genérica debería ser algo más rápida, ya que las fundiciones ya no son necesarias. Especialmente 'int' no tiene que encajonarse ni desempaquetarse. –

15

El empadronador por defecto de un foreach le da una KeyValuePair<TKey, TValue>:

foreach (var item in dictionary) 
// foreach (KeyValuePair<string, int> item in dictionary) 
{ 
    var key = item.Key; 
    var value = item.Value; 
} 

Esto simplemente compila en código que trabaja directamente con el enumerador como en tu código anterior.

O puede enumerar la .Keys o .Values directamente (pero que sólo recibe una clave o un valor en ese caso):

foreach (var key in dictionary.Keys) 

foreach (var val in dictionary.Values) 

Y o curso LINQ va en contra de los diccionarios:

C# linq in Dictionary<>

+0

para usar Var, ¿esto afectará al tipo de datos de la tecla y al valor en términos de cadena, int respectivamente? No soy amigable con el uso de var, por eso pregunto –

+2

@JoneMamni: No - 'var' simplemente le da a la variable un tipo inferido del tipo de * tiempo de compilación * del valor asignado. No hay impacto en el tiempo de ejecución. –

+1

@JoneMamni No, en este caso 'var' se deduce del tipo de la clave y el valor, en su caso con un diccionario genérico esto sería string e int. –

8

Bueno, podría hacer lo mismo con Dictionary, pero sería más limpio usar foreach en tanto casos:

foreach (var entry in dictionary) 
{ 
    string key = entry.Key; 
    int value = entry.Value; 
    // Use them... 
} 

Esto es equivalente a:

using (var iterator = dictionary.GetEnumerator()) 
{ 
    while (iterator.MoveNext()) 
    { 
     var entry = iterator.Current; 
     string key = entry.Key; 
     int value = entry.Value; 
     // Use them... 
    } 
} 

Es muy rara vez son útiles para llamar explícitamente GetEnumerator e iterar a sí mismo. Es apropiado en un puñado de casos, como cuando desea tratar el primer valor de manera diferente, pero si va a tratar todas las entradas de la misma manera, use foreach.

(Tenga en cuenta que lo que realmente es equivalente a usar var aquí, pero no equivalente a declarar un IEnumerator<KeyValuePair<string, int>> - que en realidad va a utilizar el anidado Dictionary.Enumerator estructura Eso es un detalle que generalmente no es necesario preocuparse..)

Cuestiones relacionadas