Qualcuno sa se esiste un buon equivalente alla Set
raccolta di Java in C #? So che puoi in qualche modo imitare un set usando a Dictionary
o a HashTable
popolando ma ignorando i valori, ma non è un modo molto elegante.
Qualcuno sa se esiste un buon equivalente alla Set
raccolta di Java in C #? So che puoi in qualche modo imitare un set usando a Dictionary
o a HashTable
popolando ma ignorando i valori, ma non è un modo molto elegante.
Risposte:
Prova HashSet :
La classe HashSet (Of T) fornisce operazioni di set ad alte prestazioni. Un set è una raccolta che non contiene elementi duplicati e i cui elementi non sono in un ordine particolare ...
La capacità di un oggetto HashSet (Of T) è il numero di elementi che l'oggetto può contenere. La capacità di un oggetto HashSet (Of T) aumenta automaticamente man mano che gli elementi vengono aggiunti all'oggetto.
La classe HashSet (Of T) si basa sul modello di set matematici e fornisce operazioni sui set ad alte prestazioni simili all'accesso alle chiavi delle raccolte Dictionary (Of TKey, TValue) o Hashtable . In termini semplici, la classe HashSet (Of T) può essere pensata come una raccolta Dictionary (Of TKey, TValue) senza valori.
Una raccolta HashSet (Of T) non è ordinata e non può contenere elementi duplicati ...
Se si utilizza .NET 3.5, è possibile utilizzare HashSet<T>
. È vero che .NET non soddisfa i set come Java.
Anche i PowerCollections di Wintellect possono essere d'aiuto.
Se si utilizza .NET 4.0 o versioni successive:
Nel caso in cui sia necessario l'ordinamento, utilizzare SortedSet<T>
. Altrimenti, in caso contrario, utilizzare HashSet<T>
poiché è O(1)
per le operazioni di ricerca e manipolazione. Considerando che SortedSet<T>
è O(log n)
per operazioni di ricerca e manipolazione.
Uso Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
È utilizzato in molti progetti OSS, l'ho trovato per la prima volta a NHibernate
Uso un wrapper attorno a a Dictionary<T, object>
, memorizzando valori null nei valori. Questo dà O (1) aggiungere, cercare e rimuovere i tasti e, a tutti gli effetti, si comporta come un set.
Dai un'occhiata a PowerCollections su CodePlex. Oltre a Set e OrderedSet ha alcuni altri utili tipi di raccolta come Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary e OrderedMultiDictionary.
Per più raccolte, esiste anche la libreria di raccolte generiche C5 .
So che questo è un vecchio thread, ma stavo riscontrando lo stesso problema e ho trovato HashSet molto inaffidabile perché, dato lo stesso seed, GetHashCode () ha restituito codici diversi. Quindi, ho pensato, perché non usare semplicemente un Elenco e nascondere il metodo di aggiunta in questo modo
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
Poiché Elenco utilizza il metodo Equals esclusivamente per determinare l'uguaglianza, è possibile definire il metodo Equals sul tipo T per assicurarsi di ottenere i risultati desiderati.
List.Contains
è di O(n)
complessità, il che significa che anche il tuo Add
metodo diventa O(n)
complessità. Supponendo che la collezione interna non debba essere ridimensionata, Add
per entrambi List
e HashMap
dovrebbe essere di O(1)
complessità. TLDR: funzionerà, ma è confuso e meno efficiente.