2010-01-20 18 views

Respuesta

7

No de una manera razonable, no. Usted podría utilizar la extensión de LINQ ElementAt:

for (int i = 0; i < dictionary.Keys.Count; i++) 
{ 
    Console.WriteLine(dictionary.ElementAt(i).Value);     
} 

... pero realmente no veo el punto. Solo use el método regular foreach.Si por alguna razón necesita para realizar un seguimiento de un índice mientras que la iteración, se puede hacer que "en el lado":

int index = 0; 
foreach (var item in dictionary) 
{ 
    Console.WriteLine(string.Format("[{0}] - {1}", index, item.Value)); 

    // increment the index 
    index++; 
} 
11

Puede usar foreach:

Dictionary<string,string> dictionary = new Dictionary<string,string>(); 

// ... 

foreach (KeyValuePair<string,string> kv in dictionary) 
{ 
    string key = kv.Key; 
    string value = kv.Value; 
} 
+0

Eso debería ser 'foreach'. – GraemeF

+0

De hecho, se ha solucionado mientras tanto –

+0

+1 Me lo ganaste Philippe. – ChrisBD

0

No, for es sobre todo para las colecciones con índices. Puede foreach fácilmente, sin embargo.

-1

Puede recorrer las llaves

for(int i = 0; i < myDictionary.Keys.Length; ++i) 
     myDictionary.Keys[i] ... 

o los valores

for(int i = 0; i < myDictionary.Values.Length; ++i) 
     myDictionary.Values[i] ... 

o ambos, como Philippe muestra

+0

Eso no compilará 'No se puede aplicar la indexación con [] a una expresión del tipo 'System.Collections.Generic.Dictionary KeyCollection'' –

+0

Estaba buscando: Count en vez de Length, que solo se aplica a matrices' normales ' – Oxymoron

+0

@ Oxymoron: incluso cuando se usa 'Count', tratar de acceder a los elementos en la colección' Keys' por índice ('Keys [i]') seguirá rompiendo la compilación (que era el error al que me refería en mi comentario). –

0

Si está utilizando Net 3.5 o posterior, puede utilizar LINQ y un predeceso para localizar un Valor o Valores específicos. Los diccionarios no almacenan necesariamente sus pares de KeyValue en orden (ya sea por orden de entrada o por orden de clave).

2

Existen varias formas. bucle a través de las teclas:

foreach(var key in myDictionary.Keys) 

bucle a través de los valores:

foreach(var value in myDic.Values) 

bucle a través de pares:

foreach(KeyValuePair<K, V> p in myDic) 
{ 
    var key = p.Key; 
    var value = p.Value 
} 
0

Philippe lo tiene para foreach, aunque por lo general simplificarlo a:

foreach (var pair in dictionary) 
{ 
    var key = pair.Key; 
    var value = pair.Value; 
} 

No hay forma de recorrer este conjunto de pares clave-valor utilizando un bucle for porque no están almacenados en orden. Sin embargo, puede recorrer las claves o los valores como colecciones.

+0

Usar "var" es terriblemente mala práctica en general. – Nyerguds

+0

@Nyerguds es una declaración muy arrolladora y objetiva. También es incorrecto: la palabra clave 'var' es absolutamente esencial en cualquier circunstancia en la que utilice tipos anónimos. Además, en este caso, el asker no especificó los tipos genéricos en el diccionario y encuentro (en el mundo real) que a veces es necesario cambiar los tipos. Mi uso de 'var' hace que el tipo exacto del diccionario sea irrelevante y es un código que funciona independientemente de los tipos genéricos. Hay muchos lugares en los que no permitiría que una 'var' pase por una revisión de código, pero en un fragmento de ejemplo está bien. – Keith

0

Puede OFC puede hacer, pero es un poco tonto OMI

 Dictionary<string,string> dictionary = new Dictionary<string, string>(); 
     Dictionary<string, string>.Enumerator enumerator = dictionary.GetEnumerator(); 
     for (int i = 0; i < attributeValues.Count;i++) 
     { 
      KeyValuePair<string, string> current = enumerator.Current; 
      //do something usefull 
      enumerator.MoveNext(); 
     } 

la única cosa adquirida por esto es un índice (bastante inútil), y si ese es el objetivo real, es mejor servido por algo como esto:

 int currentIndex = 0; 
     foreach (KeyValuePair<string, string> keyValuePair in dictionary) 
     { 
      //do something usefull 
      currentIndex++; 
     } 
-1

Si no tiene que ser un "para "-loop, tal vez usando el Dictionary.GetEnumerator Method con una "mientras que" -loop es una opción - es bastante fácil, así mi humilde opinión:

var enumerator = d.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
var pair = enumerator.Current; 
b += pair.Value; 
} 
enumerator.Dispose(); 

código fragmento de C# Dictionary GetEnumerator

+0

¿Por qué harías esto antes de usar un 'foreach'? Además, no está eliminando el enumeartor. – Servy

+0

el fragmento de código es de http://www.dotnetperls.com/dictionary-getenumerator, no es mi código. Y de acuerdo con ese sitio web, usar el enumerador tiene un mejor rendimiento que 'foreach' - por lo que creo que vale la pena mencionar el enumerador – user4531

+0

No importa si es tu código o no. No es un buen código, y debes arreglarlo o no usarlo. Es importante deshacerse del enumerador; si desea enumerar explícitamente, debe hacer eso. En cuanto a que es mejor que un 'foreach', es exactamente lo que un 'foreach' va a hacer. 'foreach' es solo azúcar sintáctico para esto (excepto que' foreach' lo hace correctamente, a diferencia de tu código). Un 'foreach' no será más lento; está haciendo lo mismo. – Servy