Apakah ada yang tahu jika ada yang setara dengan Set
koleksi Java di C #? Saya tahu bahwa Anda bisa meniru set menggunakan a Dictionary
atau a HashTable
dengan mengisi tetapi mengabaikan nilai-nilai, tapi itu bukan cara yang sangat elegan.
Apakah ada yang tahu jika ada yang setara dengan Set
koleksi Java di C #? Saya tahu bahwa Anda bisa meniru set menggunakan a Dictionary
atau a HashTable
dengan mengisi tetapi mengabaikan nilai-nilai, tapi itu bukan cara yang sangat elegan.
Jawaban:
Coba HashSet :
Kelas HashSet (Of T) menyediakan operasi set berkinerja tinggi. Kumpulan adalah kumpulan yang tidak mengandung elemen duplikat, dan yang elemennya tidak ada dalam urutan tertentu ...
Kapasitas objek HashSet (Of T) adalah jumlah elemen yang dapat dipegang oleh objek tersebut. Kapasitas objek HashSet (Of T) secara otomatis meningkat ketika elemen ditambahkan ke objek.
Kelas HashSet (Of T) didasarkan pada model set matematika dan menyediakan operasi set berkinerja tinggi mirip dengan mengakses kunci Kamus (Of TKey, TValue) atau koleksi Hashtable . Dalam istilah sederhana, kelas HashSet (Of T) dapat dianggap sebagai koleksi Kamus (Of TKey, TValue) tanpa nilai.
Koleksi HashSet (Of T) tidak diurutkan dan tidak dapat berisi elemen duplikat ...
Jika Anda menggunakan .NET 3.5, Anda bisa menggunakan HashSet<T>
. Memang benar bahwa .NET tidak melayani set dan Java tidak.
The Wintellect PowerCollections dapat membantu juga.
Jika Anda menggunakan .NET 4.0 atau yang lebih baru:
Jika Anda perlu menyortir, gunakan SortedSet<T>
. Kalau tidak, jika tidak, gunakan HashSet<T>
karena itu O(1)
untuk mencari dan memanipulasi operasi. Sedangkan SortedSet<T>
adalah O(log n)
untuk pencarian dan memanipulasi operasi.
Saya menggunakan Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
Ini digunakan di banyak proyek OSS, saya pertama kali menemukannya di NHibernate
Saya menggunakan pembungkus di sekitar a Dictionary<T, object>
, menyimpan nulls dalam nilai-nilai. Ini memberi O (1) menambah, mencari dan menghapus pada tombol, dan untuk semua maksud dan tujuan bertindak seperti satu set.
Lihat PowerCollections di CodePlex. Selain dari Set dan OrderedSet, ia memiliki beberapa jenis koleksi berguna lainnya seperti Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary dan OrderedMultiDictionary.
Untuk koleksi lainnya, ada juga Perpustakaan Koleksi Generik C5 .
Saya tahu ini adalah utas lama, tetapi saya mengalami masalah yang sama dan menemukan HashSet sangat tidak dapat diandalkan karena diberi benih yang sama, GetHashCode () mengembalikan kode yang berbeda. Jadi, saya pikir, mengapa tidak hanya menggunakan Daftar dan menyembunyikan metode add seperti ini
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
Karena Daftar menggunakan metode Persamaan hanya untuk menentukan kesetaraan, Anda dapat menentukan metode Persamaan pada tipe T Anda untuk memastikan Anda mendapatkan hasil yang diinginkan.
List.Contains
adalah O(n)
kompleksitas yang berarti bahwa Anda Add
metode sekarang menjadi O(n)
kompleksitas juga. Dengan asumsi koleksi batin tidak perlu diubah ukurannya, Add
untuk keduanya List
dan HashMap
harus O(1)
rumit. TLDR: Ini akan berhasil, tetapi ini peretasan dan kurang efisien.