Mengapa Microsoft tidak menyediakan implementasi generik dari OrderedDictionary?
Ada beberapa implementasi kustom yang pernah saya lihat, termasuk: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx
Tetapi mengapa Microsoft tidak memasukkannya ke dalam pustaka .net? Tentunya mereka punya alasan untuk tidak membangun obat generik .... tapi apa itu?
Sebelum memposting pesan ini, saya memang melihat: /programming/2629027/no-generic-implementation-of-ordereddictionary
Tetapi itu hanya menegaskan bahwa itu tidak ada. Bukan mengapa itu tidak ada.
Terima kasih
SortedDictionary<TKey, TValue>
: msdn.microsoft.com/en-us/library/f7fta44c.aspxJawaban:
In C # 4.0 In A Singkatnya saya membaca ini:
OrderedDictionary
adalah kombinasi dari aHashTable
danArrayList
ArrayList
ArrayList
digunakan terutama untuk kompatibilitas dengan Framework 1.x ..."ArrayList
secara fungsional serupa denganList<object>
"ArrayList
daripadaList<object>
"Kesimpulan?
Tidak generik
OrderedDictionary
karena konstruk yang mendasarinya adalah kelas disusutkan (tidak resmi) yang tidak memiliki versi generik itu sendiri.sumber
OrderedDictionary
kovarians dan kontra varians?The
OrderedDictionary
overloads operasi pengindeksan sehingga pengindeksan dengan bilangan bulatN
akan mendapatkan item dalam posisiN
, sementara mengindeks denganObject
akan mengambil item korespondennya ke objek. Jika seseorang membuat item yangOrderedDictionary<int, string>
dipanggilmyDict
, dan menambahkan (1, "George") dan (0, "Fred") dalam urutan itu, haruskahmyDict[0]
mengembalikan "George" atau "Fred"?Masalah seperti itu bisa diselesaikan dengan memaksakan batasan kelas pada tipe kunci. Di sisi lain, banyak kegunaan koleksi generik berasal dari kemampuan mereka untuk bekerja secara efisien dengan tipe nilai. Memaksakan batasan kelas pada tipe kunci akan tampak sedikit jelek.
Jika kelas tidak harus sesuai dengan CLS tetapi hanya harus bekerja dengan vb.net, desain yang masuk akal mungkin untuk menggunakan properti bernama yang diindeks. Jadi, dalam contoh di atas,
myDict.ByKey[0]
akan menghasilkan "Fred", danmyDict.BySequence[0]
akan menghasilkan "George". Sayangnya, bahasa seperti C # tidak mendukung properti yang diindeks bernama. Sementara orang bisa saja membereskan sesuatu untuk memungkinkan penggunaan sintaks di atas bahkan tanpa properti seperti itu, keputusan malang untuk membungkus bidang-bidang struktur sepertiPoint
danRectangle
berarti bahwa untukmyDict.ByKey[0] = "Wally"
bekerja,myDict.ByKey
harus mengembalikan objek kelas baru. Sebuah struct akan lebih efisien, tetapi kompiler akan menolak apa yang tampak seperti menulis ke struktur read-only (meskipun properti tidak akan memodifikasi struct yang dikembalikan olehByKey
, tetapi ganti koleksi yang menyimpan referensi).Secara pribadi, saya pikir objek kamus-ish yang ditentukan sebagai melacak urutan penyisipan akan menjadi hal yang baik untuk dimiliki; Saya juga ingin memiliki objek kamus-ish yang dapat dengan mudah mengembalikan kunci yang terkait dengan kunci tertentu (sehingga, misalnya jika seseorang memiliki kamus case-insensitive dan telah menambahkan catatan dengan kunci "GEORGE", satu bisa bertanya pada kamus kunci apa yang dikaitkan dengan "George" tanpa harus mencari semua
KeyValuePair
objek yang dikembalikan dalam enumerasi.sumber
Karena mempertahankan pesanan mencegah pencarian O (1) yang disiratkan IDictionary kecuali Anda membungkus dua koleksi (satu untuk pesanan, satu untuk pencarian), yang membuat menambah / menghapus lebih sedikit pemain dan meningkatkan penggunaan memori. Atau Anda bisa memiliki pencarian yang lebih lambat untuk penggunaan memori yang lebih sedikit.
Dugaan saya adalah tidak ada pilihan 'jelas lebih baik' di sini, jadi tidak masuk ke perpustakaan standar. Khususnya sekitar 2.0, C # masih belajar dari kesalahan Java. Saya tidak akan terkejut jika pendekatan 'segalanya dan wastafel dapur' Jawa untuk koleksi di perpustakaan standar mereka dipandang sebagai sesuatu yang harus dihindari juga.
sumber
OrderedDictionary
aList
. Saya membayangkan bahwa siapa pun dengan use case yang sah untukOrderedDictionary
menggunakannya secara khusus karena mereka membutuhkan kelas koleksi yang memiliki pencarian O (1) tetapi juga mengingat urutan penyisipan, dalam hal ini menggunakan memori tambahan tidak dapat dihindari dan dengan demikian dapat diterima.