Pertanyaan Apa cara terbaik untuk mengulang kamus?


Saya telah melihat beberapa cara berbeda untuk beralih ke kamus di C #. Apakah ada cara standar?


1944
2017-09-26 18:20


asal


Jawaban:


foreach(KeyValuePair<string, string> entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

2892
2017-09-26 18:22



Jika Anda mencoba menggunakan Kamus generik dalam C # seperti Anda akan menggunakan array asosiatif dalam bahasa lain:

foreach(var item in myDictionary)
{
  foo(item.Key);
  bar(item.Value);
}

Atau, jika Anda hanya perlu beralih ke koleksi kunci, gunakan

foreach(var item in myDictionary.Keys)
{
  foo(item);
}

Dan terakhir, jika Anda hanya tertarik pada nilai-nilai:

foreach(var item in myDictionary.Values)
{
  foo(item);
}

(Perhatikan bahwa var kata kunci adalah fitur opsional C # 3.0 dan di atas, Anda juga dapat menggunakan jenis kunci / nilai yang tepat di sini)


643
2017-09-26 18:22



Dalam beberapa kasus, Anda mungkin memerlukan counter yang mungkin disediakan oleh implementasi for-loop. Untuk itu, LINQ menyediakan ElementAt yang memungkinkan hal-hal berikut:

for (int index = 0; index < dictionary.Count; index++) {
  var item = dictionary.ElementAt(index);
  var itemKey = item.Key;
  var itemValue = item.Value;
}

107
2018-03-10 20:44



Tergantung apakah Anda mencari kunci atau nilai ...

Dari MSDN Dictionary(TKey, TValue) Deskripsi kelas:

// When you use foreach to enumerate dictionary elements,
// the elements are retrieved as KeyValuePair objects.
Console.WriteLine();
foreach( KeyValuePair<string, string> kvp in openWith )
{
    Console.WriteLine("Key = {0}, Value = {1}", 
        kvp.Key, kvp.Value);
}

// To get the values alone, use the Values property.
Dictionary<string, string>.ValueCollection valueColl =
    openWith.Values;

// The elements of the ValueCollection are strongly typed
// with the type that was specified for dictionary values.
Console.WriteLine();
foreach( string s in valueColl )
{
    Console.WriteLine("Value = {0}", s);
}

// To get the keys alone, use the Keys property.
Dictionary<string, string>.KeyCollection keyColl =
    openWith.Keys;

// The elements of the KeyCollection are strongly typed
// with the type that was specified for dictionary keys.
Console.WriteLine();
foreach( string s in keyColl )
{
    Console.WriteLine("Key = {0}", s);
}

74
2017-09-26 18:27



Umumnya, meminta "cara terbaik" tanpa konteks tertentu adalah seperti menanyakan warna apa yang terbaik.

Satu sisi, ada banyak warna dan tidak ada warna terbaik. Itu tergantung pada kebutuhan dan sering pada rasa juga.

Di sisi lain, ada banyak cara untuk beralih ke Kamus di C # dan tidak ada cara terbaik. Itu tergantung pada kebutuhan dan sering pada rasa juga.

Cara paling berterus terang

foreach (var kvp in items)
{
    // key is kvp.Key
    doStuff(kvp.Value)
}

Jika Anda hanya membutuhkan nilai (memungkinkan untuk menyebutnya item, lebih mudah dibaca daripada kvp.Value).

foreach (var item in items.Values)
{
    doStuff(item)
}

Jika Anda membutuhkan urutan yang spesifik

Umumnya, pemula terkejut tentang urutan enumerasi Kamus.

LINQ menyediakan sintaks ringkas yang memungkinkan untuk menentukan pesanan (dan banyak hal lainnya), misalnya:

foreach (var kvp in items.OrderBy(kvp => kvp.Key))
{
    // key is kvp.Key
    doStuff(kvp.Value)
}

Sekali lagi Anda mungkin hanya membutuhkan nilainya. LINQ juga menyediakan solusi ringkas untuk:

  • iterasi langsung pada nilai (memungkinkan untuk memanggilnya item, lebih mudah dibaca daripada kvp.Value)
  • tetapi diurutkan berdasarkan kunci

Ini dia:

foreach (var item in items.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value))
{
    doStuff(item)
}

Ada banyak lagi kasus penggunaan di dunia nyata yang dapat Anda lakukan dari contoh-contoh ini. Jika Anda tidak membutuhkan pesanan khusus, cukup tekan "cara paling mudah" (lihat di atas)!


55
2017-08-10 11:15



Saya akan mengatakan foreach adalah cara standar, meskipun itu jelas tergantung pada apa yang Anda cari

foreach(var kvp in my_dictionary) {
  ...
}

Apakah itu yang Anda cari?


36
2017-09-26 18:22



Anda juga dapat mencoba ini di kamus besar untuk pemrosesan multithread.

dictionary
.AsParallel()
.ForAll(pair => 
{ 
    // Process pair.Key and pair.Value here
});

27
2018-06-11 13:32