Apa cara paling efisien untuk membuat pemetaan s (yang tidak pernah berubah saat runtime) konstanstring
menjadiint
s yang ?
Saya sudah mencoba menggunakan Kamus const , tetapi itu tidak berhasil.
Saya bisa menerapkan pembungkus abadi dengan semantik yang sesuai, tetapi itu masih tampak tidak sepenuhnya benar.
Bagi mereka yang bertanya, saya menerapkan IDataErrorInfo di kelas yang dibuat dan saya sedang mencari cara untuk membuat pencarian columnName ke dalam array deskriptor saya.
Saya tidak sadar (salah ketik saat menguji! D'oh!) Yang beralih menerima string, jadi itulah yang akan saya gunakan. Terima kasih!
c#
.net
collections
dictionary
constants
David Schmitt
sumber
sumber
Jawaban:
Membuat kamus konstan yang dihasilkan waktu kompilasi yang benar-benar kompilasi di C # sebenarnya bukan tugas yang mudah. Sebenarnya, tidak ada jawaban di sini yang benar-benar mencapai itu.
Ada satu solusi yang memenuhi persyaratan Anda, meskipun tidak selalu bagus; ingat bahwa sesuai dengan spesifikasi C #, tabel switch-case dikompilasi ke tabel lompatan hash konstan. Artinya, mereka adalah kamus konstan, bukan serangkaian pernyataan if-else. Jadi pertimbangkan pernyataan sakelar kasus seperti ini:
Inilah yang Anda inginkan. Dan ya, saya tahu, itu jelek.
sumber
Ada beberapa koleksi berharga yang tidak berubah dalam kerangka saat ini. Saya dapat memikirkan satu opsi yang relatif bebas rasa sakit di .NET 3.5:
Gunakan
Enumerable.ToLookup()
-Lookup<,>
kelas tidak dapat diubah (tetapi multi-nilai pada rhs); Anda dapat melakukan ini dari yangDictionary<,>
cukup mudah:sumber
sumber
Ini adalah hal terdekat yang bisa Anda dapatkan di "Kamus CONST":
Kompiler akan cukup pintar untuk membuat kode sebersih mungkin.
sumber
Jika menggunakan 4.5+ Framework saya akan menggunakan ReadOnlyDictionary (juga ReadOnly Collection untuk daftar) untuk melakukan pemetaan / konstanta readonly. Diimplementasikan dengan cara berikut.
sumber
private static readonly Dictionary<string, string> _yourDictionaryName = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "One",1 }, { "Two",2 }, { "Three",3 }, };
Beginilah cara saya melakukannya.readonly Dictionary<TKey, TValue>
tidak setara dengan aReadOnlyDictionary<TKey, TValue>
. Padahal, cara mereka mereka "hanya baca" cukup banyak yang saling bertolak belakang. Lihat: dotnetfiddle.net/v0l4aA .Mengapa tidak menggunakan ruang nama atau kelas untuk mengumpulkan nilai Anda? Mungkin tidak sempurna, tetapi sangat bersih.
Sekarang Anda dapat mengakses .ParentClass.FooDictionary.Key1, dll.
sumber
Sepertinya tidak ada antarmuka standar yang tidak dapat diubah untuk kamus, jadi membuat pembungkus sepertinya satu-satunya pilihan yang masuk akal, sayangnya.
Edit : Marc Gravell menemukan ILookup yang saya lewatkan - yang akan memungkinkan Anda untuk setidaknya menghindari membuat pembungkus baru, meskipun Anda masih perlu mengubah Kamus dengan .ToLookup ().
Jika ini adalah kebutuhan yang dibatasi oleh skenario tertentu, Anda mungkin lebih baik dengan antarmuka yang lebih berorientasi bisnis-logika:
sumber
Saya tidak yakin mengapa tidak ada yang menyebutkan ini tetapi dalam C # untuk hal-hal yang saya tidak dapat menetapkan const, saya menggunakan properti read-only statis.
Contoh:
sumber
Hanya ide lain karena saya mengikat kotak kombo winforms:
Untuk mendapatkan nilai int dari nama tampilan dari :
pemakaian:
sumber
Kenapa tidak:
sumber