Jika saya ingin menggunakan objek sebagai kunci untuk a Dictionary
, metode apa yang perlu saya timpa untuk membandingkannya dengan cara tertentu?
Katakanlah saya memiliki kelas yang memiliki properti:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
Dan saya ingin membuat:
Dictionary<Foo, List<Stuff>>
Saya ingin Foo
objek dengan yang sama FooID
dianggap grup yang sama. Metode apa yang perlu saya ganti di Foo
kelas?
Untuk meringkas: Saya ingin mengkategorikan Stuff
objek ke dalam daftar, dikelompokkan berdasarkan Foo
objek. Stuff
objek akan memiliki FooID
untuk menautkannya ke kategorinya.
sumber
Karena Anda ingin
FooID
menjadi pengenal grup, Anda harus menggunakannya sebagai kunci dalam kamus, bukan sebagai objek Foo:Jika Anda akan menggunakan
Foo
objek sebagai kunci, Anda hanya perlu mengimplementasikan metodeGetHashCode
danEquals
untuk hanya mempertimbangkanFooID
properti. TheName
properti hanya akan menjadi bobot mati sejauhDictionary
prihatin, sehingga Anda akan hanya menggunakanFoo
sebagai pembungkus untukint
.Oleh karena itu, lebih baik menggunakan
FooID
nilainya secara langsung, dan kemudian Anda tidak perlu menerapkan apa pun karenaDictionary
sudah mendukung menggunakan anint
sebagai kunci.Sunting:
Jika Anda tetap ingin menggunakan
Foo
kelas sebagai kunci,IEqualityComparer<Foo>
mudah untuk diterapkan:Pemakaian:
sumber
Untuk Foo Anda perlu mengganti object.GetHashCode () dan object.Equals ()
Dictionary akan memanggil GetHashCode () untuk menghitung keranjang hash untuk setiap nilai dan Sama dengan untuk membandingkan apakah dua Foo identik.
Pastikan untuk menghitung kode hash yang baik (hindari banyak objek Foo yang sama memiliki kode hash yang sama), tetapi pastikan dua Foos yang sama memiliki kode hash yang sama. Anda mungkin ingin memulai dengan Equals-Method dan kemudian (di GetHashCode ()) xatau kode hash dari setiap anggota yang Anda bandingkan di Equals.
sumber
Bagaimana dengan
Hashtable
kelas!Dengan cara di atas, Anda dapat menggunakan objek apa pun (objek kelas Anda) sebagai kunci Kamus generik :)
sumber
Saya memiliki masalah yang sama. Saya sekarang dapat menggunakan objek apa pun yang saya coba sebagai kunci karena menimpa Equals dan GetHashCode.
Berikut adalah kelas yang saya bangun dengan metode untuk digunakan di dalam menimpa Equals (object obj) dan GetHashCode (). Saya memutuskan untuk menggunakan generik dan algoritma hashing yang seharusnya dapat mencakup sebagian besar objek. Beri tahu saya jika Anda melihat sesuatu di sini yang tidak berfungsi untuk beberapa jenis objek dan Anda punya cara untuk memperbaikinya.
Berikut cara penggunaannya di kelas:
sumber