Ho una domanda veloce. C'è modo di passare facilmente attraverso lo System.Collections.Generic.Dictionary
tramite la dichiarazione for
in C#?Loop through System.Collections.Generic.Dictionary via per dichiarazione
Grazie in anticipo.
Ho una domanda veloce. C'è modo di passare facilmente attraverso lo System.Collections.Generic.Dictionary
tramite la dichiarazione for
in C#?Loop through System.Collections.Generic.Dictionary via per dichiarazione
Grazie in anticipo.
Non in modo ragionevole, no. Si potrebbe utilizzare l'estensione Linq ElementAt
:
for (int i = 0; i < dictionary.Keys.Count; i++)
{
Console.WriteLine(dictionary.ElementAt(i).Value);
}
... ma davvero non vedo il punto. Basta usare l'approccio regolare foreach
.Se per qualche motivo bisogno di tenere traccia di un indice, mentre l'iterazione, si può fare che "sul lato":
int index = 0;
foreach (var item in dictionary)
{
Console.WriteLine(string.Format("[{0}] - {1}", index, item.Value));
// increment the index
index++;
}
È possibile utilizzare 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
è in gran parte per le collezioni con indici. È possibile foreach
su di esso facilmente, tuttavia.
È possibile effettuare il ciclo delle chiavi
for(int i = 0; i < myDictionary.Keys.Length; ++i)
myDictionary.Keys[i] ...
oi valori
for(int i = 0; i < myDictionary.Values.Length; ++i)
myDictionary.Values[i] ...
O sia come Philippe mostra
Che non compilerà 'Impossibile applicare l'indicizzazione con [] a un'espressione di tipo 'System.Collections.Generic.Dictionary
Stava cercando: Conteggio invece di Lunghezza, che si applica solo agli array' normali ' – Oxymoron
@ Oxymoron: anche quando si usa 'Count', provare ad accedere agli elementi nella collezione' Keys' per index ('Keys [i]') interromperà comunque la build (che era l'errore a cui mi riferivo nel mio commento). –
Se si utilizza Net 3.5 o versione successiva, è possibile utilizzare LINQ e un predecate per individuare un valore o valori specifici. I dizionari non memorizzano necessariamente le loro coppie KeyValue in ordine (né per ordine di immissione né per ordine delle chiavi).
Ci sono diversi modi. Looping tramite i tasti:
foreach(var key in myDictionary.Keys)
scorrendo valori:
foreach(var value in myDic.Values)
loop attraverso coppie:
foreach(KeyValuePair<K, V> p in myDic)
{
var key = p.Key;
var value = p.Value
}
Philippe ce l'ha per foreach
, anche se io di solito semplificare a:
foreach (var pair in dictionary)
{
var key = pair.Key;
var value = pair.Value;
}
Non c'è modo di scorrere questa collezione di coppie chiave-valore usando un ciclo for
perché non vengono memorizzate in ordine. Tuttavia, puoi scorrere ciclicamente le chiavi o i valori come raccolte.
L'uso di "var" è una pratica terribilmente cattiva in generale. – Nyerguds
@Nyerguds è una dichiarazione terribilmente ampia e obiettiva. È anche errato: la parola chiave 'var' è assolutamente essenziale in tutte le circostanze in cui usi tipi anonimi. Inoltre, in questo caso il richiedente non ha specificato i tipi generici sul dizionario e trovo (nel mondo reale) che a volte è necessario modificare i tipi. Il mio uso di 'var' rende irrilevante il tipo esatto del dizionario ed è un codice che funziona indipendentemente dai tipi generici. Ci sono molti posti in cui non lascerei un 'var' attraverso una revisione del codice, ma in uno snippet di esempio va bene. – Keith
Può OFC essere fatto, ma è un po 'sciocco IMO
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();
}
l'unica cosa acquisita da questo è un (abbastanza inutile) Indice, e se questo è il vero obiettivo, si sono meglio serviti da qualcosa di simile:
int currentIndex = 0;
foreach (KeyValuePair<string, string> keyValuePair in dictionary)
{
//do something usefull
currentIndex++;
}
Se non deve essere un "per "-loop, forse usando lo Dictionary.GetEnumerator Method con un "mentre" -loop è un'opzione - è abbastanza facile così IMHO:
var enumerator = d.GetEnumerator();
while (enumerator.MoveNext())
{
var pair = enumerator.Current;
b += pair.Value;
}
enumerator.Dispose();
codice frammento C# Dictionary GetEnumerator
Perché dovresti farlo usando un 'foreach'? Inoltre, non stai eliminando il destinatario. – Servy
il snippet di codice proviene da http://www.dotnetperls.com/dictionary-getenumerator, non è il mio codice. E secondo quel sito web, l'utilizzo dell'enumeratore ha una prestazione migliore di "foreach" - che è il motivo per cui penso che valga la pena menzionare l'enumeratore – user4531
Non importa se è il tuo codice o meno. Non è un buon codice, e dovresti risolverlo o non usarlo. È importante smaltire l'enumeratore; se vuoi enumerare esplicitamente, devi farlo. Per quanto sia migliore di un 'foreach', è esattamente ciò che un' foreach' sta per fare. 'foreach' è solo zucchero sintattico per questo (tranne che' foreach' lo fa correttamente, a differenza del tuo codice). Un 'foreach' non sarà più lento; sta facendo la stessa cosa – Servy
Cosa stai cercando di fare? Stai cercando una specifica coppia Value o KeyValue? – ChrisBD
Immagino tu voglia dire foreach piuttosto che per? –