Dapatkah saya menggunakan penginisialisasi koleksi untuk entri Kamus <TKey, TValue>?

94

Saya ingin menggunakan penginisialisasi koleksi untuk bit kode berikutnya:

public Dictionary<int, string> GetNames()
{
    Dictionary<int, string> names = new Dictionary<int, string>();
    names.Add(1, "Adam");
    names.Add(2, "Bart");
    names.Add(3, "Charlie");
    return names;
}

Jadi biasanya itu harus seperti:

return new Dictionary<int, string>
{ 
   1, "Adam",
   2, "Bart"
   ...

Tapi apa sintaks yang benar untuk ini?

Gerrie Schenck
sumber
Periksa posting ini: marcin-chwedczuk.github.io/…
csharpfolk
jangan berpikir itu adalah penipu, karena mereka menanyakan, bukan sintaks deklarasi kamus singkatan, tetapi mengapa singkatan tidak berfungsi dalam penyiapan (kuno) mereka.
NH.

Jawaban:

157
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};
bruno conde
sumber
1
Kapan penginisialisasi bekerja? Apakah hanya untuk Dictionary<TKey, TValue>subclass atau juga akan bekerja ICollection<KeyValuePair<TKey, TValue>>?
Shimmy Weitzhandler
setelah C # 3.0 Anda dapat menggunakan varsebagai pengganti tipe deklarasi, atau jika meninggalkan tipe deklarasi dapat menghilangkan new Dictio...- stackoverflow.com/questions/5678216/…
drzaus
1
@drzaus: Meskipun demikian, menggunakan var adalah praktik yang jelek dan jelek; C # adalah bahasa yang diketik dengan kuat.
Nyerguds
1
@Nyerguds: apa? varsecara harfiah hanya menghemat penekanan tombol, itu secara implisit diketik dengan kuat .
drzaus
4
@Nyerguds - Anda berhak atas pendapat Anda, saya rasa, tetapi jika Anda segera menginisialisasi variabel Anda, secara harfiah tidak ada perbedaan antara menggunakan vardan mengulang diri sendiri dengan SomeType obj = new SomeType.... Dan karena Anda tidak dapat mendeklarasikan var obj;tanpa segera melakukan inisialisasi, saya tidak melihat masalahnya. Sungguh, saya mencoba untuk belajar, tetapi saya tidak dapat mengubah posisi Anda.
drzaus
36

Sintaksnya sedikit berbeda:

Dictionary<int, string> names = new Dictionary<int, string>()
{
    { 1, "Adam" },
    { 2, "Bart" }
}

Perhatikan bahwa Anda menambahkan tupel nilai secara efektif.

Sebagai catatan samping: penginisialisasi koleksi berisi argumen yang pada dasarnya merupakan argumen untuk fungsi Add () apa pun yang berguna sehubungan dengan jenis argumen waktu kompilasi. Artinya, jika saya punya koleksi:

class FooCollection : IEnumerable
{
    public void Add(int i) ...

    public void Add(string s) ...

    public void Add(double d) ...
}

kode berikut benar-benar legal:

var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };
Anton Gogolev
sumber
Jawaban yang bagus, saya tidak tahu tentang itu! Lagi pula, kapan penginisialisasi kamus berfungsi? Apakah ini hanya untuk subclass Dictionary <TKey, TValue> atau juga akan bekerja pada ICollection <KeyValuePair <TKey, TValue >>?
Shimmy Weitzhandler
@Shimmy Collection penginisialisasi bekerja pada apa pun yang mengimplementasikan IEnumerable dan memiliki Add()metode.
Anton Gogolev
@Shimmy: kamus adalah koleksi
John Saunders
@JohnSaunders Tapi penginisialisasi kamus menerima dua parameter untuk Add.
Shimmy Weitzhandler
2
@Shimmy: mengapa itu penting? Intinya adalah ia akan bekerja dengan semua kelas yang mengimplementasikan IEnumerable<T>dan yang memiliki Addmetode. Jika Addmetode ini membutuhkan 3 parameter, maka Anda memerlukan 3 objek di dalam tanda kurung.
John Saunders
11
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...
ybo
sumber
10

Pertanyaannya diberi tag c#-3.0, tetapi untuk kelengkapan saya akan menyebutkan sintaks baru yang tersedia dengan C # 6 jika Anda menggunakan Visual Studio 2015 (atau Mono 4.0):

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie"
};

Catatan: sintaks lama yang disebutkan dalam jawaban lain masih berfungsi, jika Anda menyukainya lebih baik. Sekali lagi, untuk kelengkapan, inilah sintaks lama:

var dictionary = new Dictionary<int, string>
{
   { 1, "Adam" },
   { 2, "Bart" },
   { 3, "Charlie" }
};

Satu hal menarik lainnya untuk diperhatikan adalah dengan sintaks mana pun Anda dapat meninggalkan koma terakhir jika Anda mau, yang membuatnya lebih mudah untuk menyalin / menempel baris tambahan. Misalnya, kompilasi berikut baik-baik saja:

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie",
};
Nate Cook
sumber
5

Jika Anda mencari sintaks yang lebih sedikit verbose, Anda dapat membuat subkelas Dictionary<string, object>(atau apa pun tipe Anda) seperti ini:

public class DebugKeyValueDict : Dictionary<string, object>
{

}

Kemudian lakukan inisialisasi seperti ini

var debugValues = new DebugKeyValueDict
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

Yang mana setara dengan

var debugValues = new Dictionary<string, object>
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

Manfaatnya adalah Anda mendapatkan semua hal jenis kompilasi yang mungkin Anda inginkan seperti bisa dikatakan

is DebugKeyValueDict dari pada is IDictionary<string, object>

atau mengubah jenis kunci atau nilai di kemudian hari. Jika Anda melakukan sesuatu seperti ini dalam halaman cshtml pisau cukur, itu jauh lebih bagus untuk dilihat.

Selain tidak terlalu bertele-tele, Anda tentu saja dapat menambahkan metode ekstra ke kelas ini untuk apa pun yang Anda inginkan.

Simon_Weaver
sumber
Ini pada dasarnya adalah bagaimana ViewDataDictionary bekerja di MVC - stackoverflow.com/questions/607985/…
Simon_Weaver
Saya bereksperimen dengan tipe sebagai 'alias' untuk Kamus dan array yang diketik, dengan anggapan akan lebih aman, di dunia yang diketik, untuk menggunakan tipe yang telah ditentukan sebelumnya .. Ternyata tidak begitu berguna ketika berhubungan dengan generik dan linq.
Patrick
1

Dalam contoh kode berikut, a Dictionary<TKey, TValue>diinisialisasi dengan contoh tipe StudentName.

  Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
  {
      { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
      { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}},
      { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}
  };

dari msdn

Bellash
sumber
-3

Ya kita bisa menggunakan penginisialisasi koleksi di kamus. Jika kita memiliki kamus seperti ini-

Dictionary<int,string> dict = new Dictionary<int,string>();  
            dict.Add(1,"Mohan");  
            dict.Add(2, "Kishor");  
            dict.Add(3, "Pankaj");  
            dict.Add(4, "Jeetu");

Kami dapat menginisialisasi sebagai berikut.

Dictionary<int,string> dict = new Dictionary<int,string>  
            {  

                {1,"Mohan" },  
                {2,"Kishor" },  
                {3,"Pankaj" },  
                {4,"Jeetu" }  

            }; 
Debendra Dash
sumber
4
Sudah ada 6 jawaban lain yang menunjukkan bagaimana melakukan ini. Kami tidak membutuhkan jawaban ketujuh yang menunjukkan hal yang sama.
Pelayanan