Tengo una pregunta rápida. ¿Hay forma de fácil bucle a través de System.Collections.Generic.Dictionary
a través de la declaración for
en C#?Loop through System.Collections.Generic.Dictionary vía declaración
Gracias de antemano.
Tengo una pregunta rápida. ¿Hay forma de fácil bucle a través de System.Collections.Generic.Dictionary
a través de la declaración for
en C#?Loop through System.Collections.Generic.Dictionary vía declaración
Gracias de antemano.
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++;
}
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;
}
No, for
es sobre todo para las colecciones con índices. Puede foreach
fácilmente, sin embargo.
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
Eso no compilará 'No se puede aplicar la indexación con [] a una expresión del tipo 'System.Collections.Generic.Dictionary
Estaba buscando: Count en vez de Length, que solo se aplica a matrices' normales ' – Oxymoron
@ 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). –
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).
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
}
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.
Usar "var" es terriblemente mala práctica en general. – Nyerguds
@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
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++;
}
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
¿Por qué harías esto antes de usar un 'foreach'? Además, no está eliminando el enumeartor. – Servy
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
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
¿Qué estás tratando de hacer? ¿Estás buscando un par específico Value o KeyValue? – ChrisBD
Supongo que te refieres a foreach en lugar de a? –