Mengapa tidak ada implementasi generik dari OrderedDictionary di .net?


26

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


2
Selalu ada SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Travis Gockel

2
Kecuali saya salah paham dengan dokumen SortedDict, bukan itu yang saya inginkan. Saya tidak ingin penyortiran dilakukan. Saya hanya ingin sebuah array yang dapat saya akses dengan kunci. Bagaimanapun, saya benar-benar bertanya-tanya mengapa MS melewatkan ini. (Masalah halus, dll.)
nonot1

Apa itu kasus penggunaan khas untuk kamus yang dipesan? Saya berjuang untuk memikirkan satu dari atas kepala saya.
Carson63000

1
@Carson kapan pun Anda memiliki array item data yang juga memerlukan akses cepat acak. Untuk hanya menyimpan di Dict kehilangan informasi pemesanan, dan menggunakan array mengharuskan Anda untuk mempertahankan indeks Anda sendiri.
nonot1

2
Mintalah Eric Lippert untuk membaca dan menjawab pertanyaan Anda. Dia biasanya sangat setuju untuk membantu dengan jenis pertanyaan ini. Saya pikir Anda dapat menghubungi dia melalui blog-nya: blogs.msdn.com/b/ericlippert
devuxer

Jawaban:


17

In C # 4.0 In A Singkatnya saya membaca ini:

  1. An OrderedDictionaryadalah kombinasi dari a HashTabledanArrayList
  2. Tidak ada generik ArrayList
  3. "Kelas nongenerik ArrayListdigunakan terutama untuk kompatibilitas dengan Framework 1.x ..."
  4. "An ArrayListsecara fungsional serupa dengan List<object>"
  5. "Refleksi lebih mudah dengan nongenerik ArrayListdaripada List<object>"

Kesimpulan?

Tidak generik OrderedDictionarykarena konstruk yang mendasarinya adalah kelas disusutkan (tidak resmi) yang tidak memiliki versi generik itu sendiri.


4
Ini tidak benar-benar menjawab pertanyaan. Kamus OrderedDictionary generik dapat dibuat berdasarkan Kamus generik dan Daftar generik.
JacquesB

Salah satu aturan penggunaan kelas adalah jika UI tidak mengubah siapa yang peduli dengan implementasi? Nah, tim desain / kompiler bahasa, katakanlah, mungkin lebih suka generik yang mewarisi rekan non-generiknya . Perasaan spidey saya mengejutkan. Sebagai permulaan: Apakah leluhur yang berbeda (langsung) adalah ranjau darat di suatu tempat di jalur evolusi untuk OrderedDictionarykovarians dan kontra varians?
radarbob

15

The OrderedDictionaryoverloads operasi pengindeksan sehingga pengindeksan dengan bilangan bulat Nakan mendapatkan item dalam posisi N, sementara mengindeks dengan Objectakan mengambil item korespondennya ke objek. Jika seseorang membuat item yang OrderedDictionary<int, string>dipanggil myDict, dan menambahkan (1, "George") dan (0, "Fred") dalam urutan itu, haruskah myDict[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", dan myDict.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 seperti Pointdan Rectangleberarti bahwa untuk myDict.ByKey[0] = "Wally"bekerja, myDict.ByKeyharus 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 KeyValuePairobjek yang dikembalikan dalam enumerasi.


3

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.


1
Memiliki pencarian yang lebih lambat dengan memori yang lebih sedikit hanya membuat OrderedDictionarya List. Saya membayangkan bahwa siapa pun dengan use case yang sah untuk OrderedDictionarymenggunakannya 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.
Abion47
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.