Bisakah Anda menjelaskan apa perbedaan antara HashSet<T>
dan List<T>
. NET?
Mungkin Anda bisa menjelaskan dengan contoh dalam kasus apa yang HashSet<T>
lebih disukai List<T>
?
.net
list
hashset
difference
kue pensil
sumber
sumber
Jawaban:
Tidak seperti Daftar <> ...
HashSet adalah Daftar tanpa anggota duplikat.
Karena HashSet dibatasi hanya berisi entri unik, struktur internal dioptimalkan untuk pencarian (dibandingkan dengan daftar) - itu jauh lebih cepat
Menambahkan ke HashSet mengembalikan boolean - false jika penambahan gagal karena sudah ada di Set
Dapat melakukan operasi set matematis terhadap Set: Union / Intersection / IsSubsetOf dll.
HashSet tidak menerapkan ICollection hanya IList
Anda tidak dapat menggunakan indeks dengan HashSet, hanya enumerator.
Alasan utama untuk menggunakan HashSet adalah jika Anda tertarik untuk melakukan operasi Set.
Diberikan 2 set: hashSet1 dan hashSet2
terbang dibandingkan dengan operasi yang setara menggunakan LINQ. Menulis juga lebih rapi!
sumber
Union
metode. Saya telah menggunakanUnionWith
sebagai gantinya.Agar lebih tepat mari kita tunjukkan dengan contoh,
Anda tidak dapat menggunakan HashSet seperti pada contoh berikut.
hashSet1[i]
akan menghasilkan kesalahan:Anda dapat menggunakan foreach statement:
Anda tidak dapat menambahkan item duplikat ke HashSet sementara Daftar memungkinkan Anda untuk melakukan ini dan saat Anda menambahkan item ke HashSet, Anda dapat memeriksa apakah itu berisi item atau tidak.
HashSet memiliki beberapa fungsi yang berguna seperti
IntersectWith
,UnionWith
,IsProperSubsetOf
,ExceptWith
,SymmetricExceptWith
dllIsProperSubsetOf
:UnionWith
:IntersectWith
:ExceptWith
:SymmetricExceptWith
:Omong-omong, pesanan tidak disimpan dalam HashSets. Dalam contoh, kami menambahkan elemen "2" terakhir tetapi berada di urutan kedua:
sumber
A
HashSet<T>
adalah kelas yang dirancang untuk memberi AndaO(1)
pencarian untuk penahanan (yaitu, apakah koleksi ini mengandung objek tertentu, dan katakan padaku jawabannya dengan cepat).A
List<T>
adalah kelas yang dirancang untuk memberi Anda koleksi denganO(1)
akses acak daripada yang dapat tumbuh secara dinamis (pikirkan array dinamis). Anda dapat menguji penahanan dalamO(n)
waktu (kecuali daftar diurutkan, maka Anda dapat melakukan pencarian biner dalamO(log n)
waktu).Ketika Anda ingin menguji penahanan di
O(1)
.sumber
Gunakan
List<T>
ketika Anda ingin:Jika Anda tahu indeks dari item yang Anda inginkan (bukan nilai item itu sendiri) pengambilan adalah
O(1)
. Jika Anda tidak tahu indeksnya, mencari item membutuhkan lebih banyak waktu,O(n)
untuk koleksi yang tidak disortir.Gunakan
Hashset<T>
ketika Anda ingin:Jika Anda tahu nama benda yang ingin Anda temukan, Cari
O(1)
(itu bagian 'Hash'). Itu tidak mempertahankan pemesanan seperti yangList<T>
dilakukan dan Anda tidak dapat menyimpan duplikat (menambahkan duplikat tidak berpengaruh, itulah bagian 'Set').Contoh kapan harus menggunakan
Hashset<T>
adalah jika Anda ingin mengetahui apakah kata yang dimainkan di permainan Scrabble adalah kata yang valid dalam bahasa Inggris (atau bahasa lain). Bahkan lebih baik jika Anda ingin membangun layanan web untuk digunakan oleh semua contoh versi online dari permainan seperti itu.A
List<T>
akan menjadi struktur data yang baik untuk membuat papan skor untuk melacak skor pemain.sumber
Daftar adalah daftar yang diurutkan. ini
HashSet adalah himpunan. Itu:
Daftar lebih tepat ketika Anda ingin mengakses koleksi Anda seolah-olah itu seperti sebuah array yang dapat Anda tambahkan, masukkan dan hapus item. HashSet adalah pilihan yang lebih baik jika Anda ingin memperlakukan koleksi Anda seperti "tas" item yang urutannya tidak penting atau ketika Anda ingin membandingkannya dengan set lain menggunakan operasi seperti IntersectWith atau UnionWith.
sumber
Daftar belum tentu unik, sementara hashset, untuk satu.
sumber
Daftar adalah kumpulan objek yang diurutkan dari Tipe T yang tidak seperti array, Anda dapat menambah dan menghapus entri.
Anda akan menggunakan daftar di mana Anda ingin mereferensikan anggota dalam urutan Anda menyimpannya dan Anda mengaksesnya dengan posisi daripada item itu sendiri.
HashSet seperti kamus bahwa item itu sendiri adalah kunci serta nilainya, pemesanan tidak dijamin.
Anda akan menggunakan HashSet di mana Anda ingin memeriksa bahwa suatu objek ada di koleksi
sumber
List
mempertahankan pesanan (yaitu ketika hal-hal ditambahkan), tetapi tidak secara otomatis mengurutkan item. Anda harus menelepon.Sort
atau menggunakan aSortedList
.Jika Anda memutuskan untuk menerapkan struktur data ini untuk penggunaan aktual dalam pengembangan berbasis data, HashSet sangat membantu dalam menguji replikasi terhadap sumber adaptor data, untuk pembersihan data dan migrasi.
Juga, jika menggunakan Kelas DataAnnotations, seseorang dapat menerapkan logika Kunci pada properti kelas dan secara efektif mengontrol Indeks Alami (berkerumun atau tidak) dengan HashSet, di mana ini akan sangat sulit dalam implementasi Daftar.
Opsi kuat untuk menggunakan daftar adalah untuk mengimplementasikan generik untuk beberapa media pada Model Tampilan, seperti mengirim daftar kelas ke Tampilan MVC untuk DropDownList Helper, dan juga untuk mengirim sebagai konstruk JSON melalui WebApi. Daftar ini memungkinkan logika kumpulan kelas tipikal, dan menjaga fleksibilitas untuk pendekatan yang lebih mirip "Antarmuka" untuk menghitung model tampilan tunggal ke media yang berbeda.
sumber