2010-03-15 13 views
14

Se voglio solo un elenco ordinato di sole date, numeri interi o doppi è davvero necessario dover definire una lista ordinata (di numero intero, numero intero)?Perché la lista ordinata deve avere una coppia di valori chiave?

Sembra intrigante per me, ma potrebbe essere solo trival. Preferirei usare solo una SortedList (di Integer).

(Questa domanda è in relazione alle collezioni generici .Net)

+0

possibile duplicato di [Esiste una classe SortedList in .net? (non SortedList che in realtà è una sorta di SortedDictionnary)] (http://stackoverflow.com/questions/389813/is-there-a-sortedlistt-class-in-net-non-sortedlistkey-value-which-is- atto) – nawfal

risposta

8

La prossima versione di .NET (4.0) avrà la classe SortedSet che fa esattamente ciò che si desidera. Fino ad allora, l'incapsulamento di SortedList si avvicina di più a meno che non si desideri implementare una propria classe per farlo o utilizzare librerie di raccolte esterne (ad esempio C5 con una classe SortedArray e una classe TreeSet).

+5

SortedSet non aggiungerà un elemento uguale a quello già presente nel set, come richiesto dalla teoria degli insiemi. Una SortedList dovrebbe essere in grado di gestire più istanze dello stesso valore e ordinarle correttamente. – gligoran

3

è possibile utilizzare un normale List<T> e chiamare Sort su di esso.

+3

Questo può essere inefficiente per elenchi di grandi dimensioni se si ordina di frequente; inoltre, devi ricordarti di ordinarlo ogni volta che cambia. –

-1

Penso che HashSet<int> possa soddisfare le tue esigenze.

+2

Questo non è ordinato. Quindi, no. –

0

L'elenco ordinato ordina sulla chiave e non sui valori. Da MSDN

Gli elementi di un oggetto SortedList sono ordinati per chiavi o secondo una specifica implementazione IComparer specificato quando viene creata o secondo all'attuazione IComparable fornite dai tasti stessi il SortedList. In in entrambi i casi, un SortedList non consente chiavi duplicate.

Quindi è fondamentalmente una classe di dizionario che supporta l'ordinamento. List d'altra parte ordina i valori

1

Sì, è necessario, perché è così che è stata progettata l'API. :-)

Ma non è difficile semplicemente creare il proprio SortedList<T> che utilizza SortedList<K,V>. 5 righe di codice?

class SortedList<T> : IEnumerable<T> { 
    SortedList<T,int> _list = new SortedList<T,int>(); 
    public IEnumerator<T> GetEnumerator() { return _list.Keys.GetEnumerator(); } 
    IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } 
    public void Add(T v) { _list.Add(v, 1); } 
    public int Count { get { return _list.Count; } } 
} 

L'unico problema è, SortedList non può gestire i duplicati.

+0

Basta implementare anche ienumerable non generico. Vedi http://stackoverflow.com/questions/8760322/troubles-implementing-ienumerablet. L'ho modificato per te. –

Problemi correlati