2010-01-20 10 views
6

için Hızlı bir sorum var. C# for deyimi aracılığıyla System.Collections.Generic.Dictionary aracılığıyla döngü kolay yolu var mı?System.Collections.Generic.Dictionary üzerinden döngü üzerinden geçme

Şimdiden teşekkürler. Çoğunlukla endeksleri ile koleksiyonları için

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

// ... 

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

den

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

kod pasajı? Belirli bir Değer mi yoksa KeyValue çifti mi arıyorsunuz? – ChrisBD

+0

Bunun için foreach demek istediniz mi? –

cevap

7

Makul bir şekilde değil, hayır. Sen Linq uzantısı ElementAt kullanabilirsiniz:

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

... ama gerçekten anlamı yok. Sadece düzenli foreach yaklaşımını kullanın.

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

    // increment the index 
    index++; 
} 
11

Sen foreach kullanabilirsiniz. Bununla birlikte, foreach üzerinde kolayca yapabilirsiniz. Eğer o zaman LINQ kullanabilir ve daha sonra net 3.5 veya kullanıyorsanız

+0

Bu 'foreach' olmalıdır. – GraemeF

+0

Gerçekten de, –

+0

1 Philippe beni alt arada giderildi. – ChrisBD

0

Hayır, for geçerli:

-1

yapabilirsiniz tuşları

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

veya değerler

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

Veya Philippe olarak ikisi üzerinde döngü

+0

Bu, derlenmeyecektir: [System.Collections.Generic.Dictionary KeyCollection 'türünde bir ifadeye [] ile indeksleme yapılamıyor. –

+0

O arıyordu: Uzunluk yerine, yalnızca' normal 'diziler için geçerli olan sayı – Oxymoron

+0

@ oksimoron: hala (benim yorum ben atıfta bulundu hata idi) yapı kıracak dizine göre 'Keys' koleksiyonunda öğelerini erişmek için (' Keys [i] ') çalışırken,' Count' kullanırken bile. –

0

gösterir Belirli bir Değer veya Değerleri bulmak için bir önek. Sözlükler, KeyValue çiftlerini zorunlu olarak (giriş sırasına göre veya Anahtar sırası ile) saklamamaktadır.

2

Çeşitli yollar vardır. tuşları aracılığıyla döngü: Genellikle bir basitleştirmeye olsa foreach için aldım

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

Philippe'nın: çiftleri arasında döngü

foreach(var value in myDic.Values) 

:

foreach(var key in myDictionary.Keys) 

değerler arasında döngü

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

Sırayla depolanmadıklarından, for döngüsünü kullanarak bu anahtar-değer çiftleri koleksiyonunu kullanmanın bir yolu yoktur. Ancak, anahtarlar veya değerler aracılığıyla koleksiyonlar halinde dönebilirsiniz.

+0

"Var" kullanımı genel olarak çok kötü bir uygulamadır. Acayip süpürme ve objektif bir ifade – Nyerguds

+0

@Nyerguds. Ayrıca yanlıştır - anonim türlerini kullandığınız her koşulda 'var 'anahtar kelimesi kesinlikle gereklidir. Ayrıca bazen türlerini değiştirmek gerektiğini, bu durumda asker sözlüğe jenerik türlerini belirtmedi ve ben (gerçek dünyada) bulabilirsiniz. 'Var' kullanımım, sözlüğün tam türünü alakasız kılar ve genel türlerden bağımsız olarak çalışan koddur. Kod incelemesiyle "var" olmasına izin vermeyeceğim pek çok yer var, ancak bir örnek snippet'inde bu iyi. – Keith

0

Bu ofc yapılabilir, ancak saçma biraz 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(); 
     } 
şudur: nedense bir dizinin yineleme sırasında takip etmek için gerekirse, "tarafında" bunu yapabilir Bu kazanılan

tek şey (oldukça yararsız) endeksidir ve bu gerçek hedefi ise, daha iyi böyle bir şey tarafından sunulmaktadır:

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

bir "için olmak zorunda değilse "-loop, belkikullanarak ile 210 bir -loop bir seçenektir "iken" - bu yanı IMHO oldukça kolaydır: Tek yapmanız çalıştığımız şey C# Dictionary GetEnumerator

+0

Bunu neden foreach kullanarak yapıyorsunuz? Ayrıca, enumeartor'u yok etmiyorsunuz. – Servy

+0

kod pasajı http://www.dotnetperls.com/dictionary-getenumerator dan, benim kodu değil. ben Onun Kodunuzdaki eğer ya da değil fark etmez numaralandırıcıyı – user4531

+0

kayda değer olduğunu düşünüyorum nedeni budur - Ve bu internet sitesine göre, numaralandırıcıyı kullanarak 'foreach' daha iyi bir performansa sahiptir. İyi bir kod değil, ya düzeltmeli ya da kullanmamalısın. Sayımı elden çıkarmak önemlidir; Açıkça saymak isterseniz, bunu yapmanız gerekir. Bir "foreach" dan daha iyi olduğu gibi, bir "foreach" ın yapacağı şey tam olarak budur. 'foreach', bunun için sadece sözdizimsel şekerdir (foreach'ın kodunuzun aksine doğru bir şekilde yapması dışında). Bir "foreach" daha yavaş olmayacak; Aynı şeyi yapıyor. – Servy