Herkes Java'nın Set
C # koleksiyonuna iyi bir eşdeğer olup olmadığını biliyor mu ? Bir kümesi a Dictionary
veya a kullanarak HashTable
doldurup değerleri göz ardı ederek biraz taklit edebileceğinizi biliyorum , ama bu çok zarif bir yol değil.
Herkes Java'nın Set
C # koleksiyonuna iyi bir eşdeğer olup olmadığını biliyor mu ? Bir kümesi a Dictionary
veya a kullanarak HashTable
doldurup değerleri göz ardı ederek biraz taklit edebileceğinizi biliyorum , ama bu çok zarif bir yol değil.
Yanıtlar:
HashSet'i deneyin :
HashSet (Of T) sınıfı yüksek performanslı set işlemleri sağlar. Küme, yinelenen öğe içermeyen ve öğeleri belirli bir sırada olmayan bir koleksiyon ...
HashSet (Of T) nesnesinin kapasitesi, nesnenin tutabileceği öğe sayısıdır. HashSet (Of T) nesnesinin kapasitesi, nesneye öğeler eklendikçe otomatik olarak artar.
HashSet (Of T) sınıfı, matematiksel kümelerin modelini temel alır ve Dictionary (TKey, TValue) veya Hashtable koleksiyonlarının anahtarlarına erişmeye benzer yüksek performanslı küme işlemleri sağlar . Basit bir ifadeyle, HashSet (Of T) sınıfı değer içermeyen bir Dictionary (Of TKey, TValue) koleksiyonu olarak düşünülebilir .
Bir HashSet (Of T) koleksiyonu sıralanmaz ve yinelenen öğeler içeremez ...
.NET 3.5 kullanıyorsanız, kullanabilirsiniz HashSet<T>
. .NET'in Java'nın yanı sıra setlere hitap etmediği doğrudur.
Wintellect PowerCollections çok yardımcı olabilir.
.NET 4.0 veya üstünü kullanıyorsanız:
Sıralama yapmanız gereken durumda kullanın SortedSet<T>
. Aksi Aksi takdirde, o zaman kullanmak HashSet<T>
Çünkü o O(1)
arama için ve operasyonları manipüle. Oysa SortedSet<T>
olduğu O(log n)
arama için ve operasyonları manipüle.
Iesi.Collections'ı kullanıyorum http://www.codeproject.com/KB/recipes/sets.aspx
Birçok OSS projesinde kullanıldı, ilk olarak NHibernate'de karşılaştım
Dictionary<T, object>
Değerleri içinde null'ları depolayan bir paketleyici kullanıyorum . Bu, O (1) tuşlarına ekleme, arama ve kaldırma sağlar ve tüm niyet ve amaçlara küme gibi davranır.
CodePlex'te PowerCollections'a bir göz atın . Set ve OrderedSet dışında Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary ve OrderedMultiDictionary gibi birkaç yararlı toplama türü vardır.
Daha fazla koleksiyon için C5 Genel Koleksiyon Kütüphanesi de bulunmaktadır .
Bu eski bir iş parçacığı olduğunu biliyorum, ama aynı soruna koşuyordu ve aynı tohum verildiğinde GetHashCode () farklı kodlar döndü çünkü HashSet çok güvenilmez bulundu. Bu yüzden, neden sadece bir Liste kullanmak ve bu şekilde ekleme yöntemini gizlemek değil diye düşündüm
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
Liste yalnızca eşitliği belirlemek için Eşittir yöntemini kullandığından, istediğiniz sonucu aldığınızdan emin olmak için T türünüzde Eşittir yöntemini tanımlayabilirsiniz.
List.Contains
taşımaktadır O(n)
sizin demekse karmaşıklık Add
yöntemi şimdi olur O(n)
sıra karmaşıklığı. İç koleksiyon varsayarsak, yeniden boyutlandırılabilir gerekmez Add
ikisi için List
ve HashMap
olmalıdır O(1)
karmaşıklığı. TLDR: Bu işe yarayacak, ancak hileli ve daha az verimli.