2010-01-20 12 views

risposta

7

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++; 
} 
11

È 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; 
} 
+0

Questo dovrebbe essere 'foreach'. – GraemeF

+0

Infatti, è stato risolto nel frattempo –

+0

+1 Mi hai battuto Philippe. – ChrisBD

0

No, for è in gran parte per le collezioni con indici. È possibile foreach su di esso facilmente, tuttavia.

-1

È 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

+0

Che non compilerà 'Impossibile applicare l'indicizzazione con [] a un'espressione di tipo 'System.Collections.Generic.Dictionary KeyCollection'' –

+0

Stava cercando: Conteggio invece di Lunghezza, che si applica solo agli array' normali ' – Oxymoron

+0

@ 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). –

0

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).

2

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 
} 
0

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.

+0

L'uso di "var" è una pratica terribilmente cattiva in generale. – Nyerguds

+0

@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

0

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++; 
     } 
-1

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

+0

Perché dovresti farlo usando un 'foreach'? Inoltre, non stai eliminando il destinatario. – Servy

+0

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

+0

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