Saat ini saya memiliki WebSocket antara JavaScript dan server yang diprogram dalam C #. Dalam JavaScript, saya dapat mengirimkan data dengan mudah menggunakan array asosiatif:
var data = {'test': 'val',
'test2': 'val2'};
Untuk mewakili objek data ini di sisi server, saya menggunakan a Dictionary<string, string>
, tapi ini lebih 'mengetik mahal' daripada di JavaScript:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
Apakah ada semacam notasi literal untuk array asosiatif Dictionary
dalam C #?
c#
dictionary
literals
pimvdb
sumber
sumber
Jawaban:
Anda menggunakan sintaks initializer koleksi , tetapi Anda masih harus membuat
new Dictionary<string, string>
objek terlebih dahulu karena sintaks pintasan diterjemahkan ke sekelompokAdd()
panggilan (seperti kode Anda):Di C # 6, Anda sekarang memiliki opsi untuk menggunakan sintaks yang lebih intuitif dengan Kamus serta jenis lain yang mendukung pengindeks . Pernyataan di atas dapat ditulis ulang sebagai:
Tidak seperti initializers koleksi, ini memanggil setter pengindeks di bawah tenda, daripada
Add()
metode yang sesuai .sumber
Dictionary<string, string>
? Tampaknya agak berlebihan, tetapi saya mungkin salah. Sunting: Ini sepertinya memang cara yang lebih disukai, terima kasih.var
, kompiler akan menyimpulkan tipe darinew
. Saya mengedit jawaban saya.Dictionary<string, string>
,. Kode saya awalnya menyatakan jenisnya, saya baru saja mengubahnyavar
setelah komentarnya.Sementara, jawaban penginisialisasi kamus benar-benar benar, ada pendekatan lain untuk hal ini yang akan saya tunjukkan (tapi saya mungkin tidak merekomendasikannya). Jika tujuan Anda adalah untuk menyediakan penggunaan API singkat, Anda dapat menggunakan objek anonim.
Variabel "data" kemudian merupakan tipe anonim yang "tidak dapat diucapkan", jadi Anda hanya bisa meneruskannya sebagai
System.Object
. Anda kemudian dapat menulis kode yang dapat mengubah objek anonim menjadi kamus. Kode seperti itu akan bergantung pada refleksi, yang berpotensi lambat. Namun, Anda bisa menggunakanSystem.Reflection.Emit
, atauSystem.Linq.Expressions
untuk mengkompilasi dan men-cache delegasi yang akan membuat panggilan berikutnya lebih cepat.Asp.net MVC API menggunakan teknik ini di sejumlah tempat yang pernah saya lihat. Banyak Pembantu Html memiliki kelebihan yang menerima objek atau kamus. Saya berasumsi tujuan desain API mereka sama dengan apa yang Anda cari; sintaks singkat di pemanggilan metode.
sumber
Menggunakannya
DynamicObject
, tidaklah sulit untuk membuat penginisialisasi kamus yang lebih sederhana.Bayangkan Anda ingin memanggil metode berikut
menggunakan sintaks literal seperti
Ini dapat dicapai dengan membuat objek dinamis seperti ini
sumber
Gunakan Kamus Sastra (proposal C # 9)
C # 9 memperkenalkan sintaksis yang lebih sederhana untuk membuat
Dictionary<TKey,TValue>
objek yang diinisialisasi tanpa harus menentukan nama jenis Kamus atau parameter tipe. Parameter tipe untuk kamus disimpulkan menggunakan aturan yang ada yang digunakan untuk inferensi tipe array.Sintaks ini membuat kerja dengan kamus di C # lebih sederhana dan menghapus kode yang berlebihan.
Anda dapat mengikuti masalah di GitHub (dan ini adalah tonggak sejarah untuk C # 9 ).
Sunting: Proposal ini saat ini ditolak :
sumber