Apakah ada kelas kamus di perpustakaan .NET base class yang memungkinkan duplikat kunci untuk digunakan? Satu-satunya solusi yang saya temukan adalah membuat, misalnya, kelas seperti:
Dictionary<string, List<object>>
Tapi ini cukup menjengkelkan untuk digunakan. Di Jawa, saya percaya MultiMap menyelesaikan ini, tetapi tidak dapat menemukan analog di .NET.
c#
.net
dictionary
multimap
Siput mekanik
sumber
sumber
{ a, 1 }
dan{ a, 2 }
dalam tabel hash di manaa
menjadi kuncinya, salah satu alternatif adalah memiliki{ a, [1, 2] }
.Jawaban:
Jika Anda menggunakan .NET 3.5, gunakan
Lookup
kelas.EDIT: Anda biasanya membuat
Lookup
menggunakanEnumerable.ToLookup
. Ini mengasumsikan bahwa Anda tidak perlu mengubahnya setelah itu - tetapi saya biasanya menemukan itu cukup baik.Jika itu tidak berhasil untuk Anda, saya tidak berpikir ada sesuatu dalam kerangka kerja yang akan membantu - dan menggunakan kamus sama baiknya dengan mendapatkan :(
sumber
Lookup
tidak bisa serialKelas Daftar sebenarnya berfungsi cukup baik untuk koleksi kunci / nilai yang berisi duplikat di mana Anda ingin beralih pada koleksi. Contoh:
sumber
Berikut adalah salah satu cara untuk melakukan ini dengan List <KeyValuePair <string, string>>
Output k1 = v1, k1 = v2, k1 = v3
sumber
Jika Anda menggunakan string baik sebagai kunci maupun nilainya, Anda dapat menggunakan System.Collections.Specialized.NameValueCollection , yang akan mengembalikan array nilai string melalui metode GetValues (kunci kunci).
sumber
Saya baru saja menemukan pustaka PowerCollections yang mencakup, antara lain, kelas yang disebut MultiDictionary. Ini dengan rapi membungkus jenis fungsi ini.
sumber
Catatan yang sangat penting tentang penggunaan Pencarian:
Anda dapat membuat instance dari
Lookup(TKey, TElement)
dengan memanggilToLookup
objek yang mengimplementasikanIEnumerable(T)
Tidak ada konstruktor publik untuk membuat instance baru a
Lookup(TKey, TElement)
. Selain itu,Lookup(TKey, TElement)
objek tidak dapat diubah, yaitu, Anda tidak dapat menambah atau menghapus elemen atau kunci dariLookup(TKey, TElement)
objek setelah itu dibuat.(dari MSDN)
Saya pikir ini akan menjadi show stopper untuk sebagian besar kegunaan.
sumber
Saya pikir sesuatu seperti
List<KeyValuePair<object, object>>
akan melakukan pekerjaan itu.sumber
Jika Anda menggunakan> = .NET 4 maka Anda dapat menggunakan
Tuple
Kelas:sumber
List<KeyValuePair<key, value>>
solusi seperti di atas. Apakah aku salah?Cukup mudah untuk "memutar versi Anda sendiri" dari kamus yang memungkinkan entri "kunci duplikat". Berikut ini adalah implementasi sederhana yang kasar. Anda mungkin ingin mempertimbangkan untuk menambahkan dukungan untuk sebagian besar (jika tidak semua) pada dasarnya
IDictionary<T>
.Contoh cepat tentang cara menggunakannya:
sumber
Sebagai jawaban atas pertanyaan awal. Sesuatu seperti
Dictionary<string, List<object>>
diimplementasikan di kelas yang disebutMultiMap
di TheCode Project
.Anda dapat menemukan info lebih lanjut ke tautan di bawah ini: http://www.codeproject.com/KB/cs/MultiKeyDictionary.aspx
sumber
NameValueCollection mendukung beberapa nilai string di bawah satu kunci (yang juga merupakan string), tetapi itu adalah satu-satunya contoh yang saya ketahui.
Saya cenderung membuat konstruksi yang mirip dengan yang ada dalam contoh Anda ketika saya mengalami situasi di mana saya memerlukan fungsionalitas semacam itu.
sumber
Saat menggunakan
List<KeyValuePair<string, object>>
opsi, Anda bisa menggunakan LINQ untuk melakukan pencarian:sumber
Karena C # baru (saya yakin ini dari 7.0), Anda juga dapat melakukan sesuatu seperti ini:
dan Anda menggunakannya sebagai Daftar standar, tetapi dengan dua nilai bernama apa pun yang Anda inginkan
sumber
Apakah maksud Anda kongruen dan bukan duplikat yang sebenarnya? Kalau tidak, hashtable tidak akan bisa berfungsi.
Congruent berarti bahwa dua kunci terpisah dapat hash dengan nilai yang setara, tetapi kunci tidak sama.
Sebagai contoh: katakanlah fungsi hash hash Anda hanya hashval = key mod 3. Baik 1 dan 4 peta ke 1, tetapi merupakan nilai yang berbeda. Di sinilah gagasan Anda tentang daftar berperan.
Ketika Anda perlu mencari 1, nilai itu di-hash ke 1, daftar dilewati hingga Kunci = 1 ditemukan.
Jika Anda mengizinkan kunci duplikat untuk dimasukkan, Anda tidak akan dapat membedakan kunci mana yang dipetakan ke nilai mana.
sumber
Cara saya menggunakan hanya a
Dictionary<string, List<string>>
Dengan cara ini Anda memiliki kunci tunggal yang memegang daftar string.
Contoh:
sumber
Saya sengaja menemukan posting ini untuk mencari jawaban yang sama, dan tidak menemukannya, jadi saya mencocokkan solusi contoh sederhana menggunakan daftar kamus, menimpa operator [] untuk menambahkan kamus baru ke daftar ketika semua yang lain memiliki diberikan kunci (set), dan mengembalikan daftar nilai (dapatkan).
Itu jelek dan tidak efisien, itu HANYA mendapat / set dengan kunci, dan selalu mengembalikan daftar, tetapi berfungsi:
sumber
Saya mengubah jawaban @Hector Correa menjadi ekstensi dengan tipe generik dan juga menambahkan TryGetValue khusus ke dalamnya.
sumber
Ini adalah cara derek Kamus serentak saya pikir ini akan membantu Anda:
contoh:
sumber
saya menggunakan kelas sederhana ini:
pemakaian:
sumber
Anda dapat membuat bungkus kamus Anda sendiri, sesuatu seperti ini, sebagai bonus itu mendukung nilai nol sebagai kunci:
Sampel penggunaan:
sumber
var dictionary = new OpenDictionary<string, int>(); dictionary.Add("1", 1); // The next line won't throw an exception; dictionary.Add("1", 2); dictionary.TryGetEntries("1", out List<int> result); // result is { 1, 2 }
Anda dapat mendefinisikan metode untuk membuat kunci string Senyawa di mana Anda ingin menggunakan kamus. Anda harus menggunakan metode ini untuk membuat kunci Anda, misalnya:
untuk menggunakan:
sumber
Kunci duplikat memutus seluruh kontrak Kamus. Dalam kamus, setiap tombol unik dan dipetakan ke satu nilai. Jika Anda ingin menautkan suatu objek ke sejumlah objek tambahan yang sewenang-wenang, taruhan terbaik mungkin adalah sesuatu yang mirip dengan DataSet (secara umum menggunakan tabel). Letakkan kunci Anda di satu kolom dan nilai Anda di kolom lainnya. Ini secara signifikan lebih lambat dari sebuah kamus, tetapi itu adalah tradeoff Anda karena kehilangan kemampuan untuk hash objek utama.
sumber
Ini juga mungkin:
Dengan cara ini, kita dapat memiliki kunci unik. Semoga ini berhasil untuk Anda.
sumber
Anda dapat menambahkan kunci yang sama dengan case berbeda seperti:
key1
Key1
key1
key1
key1
key1
Saya tahu adalah jawaban bodoh, tetapi berhasil untuk saya.
sumber