2011-11-11 9 views
7

Mi chiedo come ottenere il prossimo elemento in una lista ordinata C#. Finora mi è venuta in mente il seguente codice:C# Elenco ordinato: come ottenere l'elemento successivo?

SortedList<int, Bla> mList; 

Bla someElement = mList[key]; 
Bla next  = mList[mList.Keys[mList.IndexOfKey(key) + 1]]; 

non sono sicuro se questo è il modo più intelligente per farlo ;-)

+0

Specificare i tipi esattamente. –

+0

Qual è il tipo di 'mList'? – ChrisWue

+0

Oops, mi dispiace. Ho aggiunto la dichiarazione della lista ... – Boris

risposta

7

Dato che è possibile accedere a una SortedList da index (see the Remarks section), mi consiglia di utilizzare il seguente:

var index = mList.IndexOfKey(key); 
var first = mList.Values[index]; 
var second = mList.Values[index + 1]; 

questo funzionerà nello stesso O(log n) come una singola ricerca.

Ecco anche il modo LINQ per farlo:

var items = mList.SkipWhile(m => m.Key != key).Select(m => m.Value).Take(2).ToList(); // Avoid double-enumeration by calling ToList 
var first = mList[0]; 
var second = mList[1]; 

Questo sarà solo enumerare una volta. Verrà eseguito in O(n).

+0

Che in realtà ha fatto il lavoro. Molte grazie! – Boris

6

SortedList si può accedere sia da chiave e l'indice

var IndexOfKey = mList.IndexOfKey(key); 

incremento dell'indice,

IndexOfKey++; //Handle last index case 

Ottieni l'articolo successivo per indice.

var nextElement = mList.GetByIndex(IndexOfKey); 
+0

Questo si riferisce a 'SortedList '? SortedList sotto Generics non hv 'GetByIndex' a meno che non abbia frainteso qualcosa – V4Vendetta

+0

@ V4Vendetta Credo sia così –

+3

No, SortedList non ha GetByIndex ... – Boris

3

Uso enumeratore:

IDictionaryEnumerator iterator = mList.GetEnumerator(); 
iterator.MoveNext(); 
Bla first = iterator.Value; 
iterator.MoveNext(); 
Bla next = iterator.Value; 
+0

Ma l'OP ho pensato avesse già un elemento per il quale voleva trovare il prossimo –

+0

Questo è vero. Mi piacerebbe trovare un elemento nell'elenco (preferibilmente molto veloce) e quindi iterare da lì ... – Boris

+0

Questo ottiene i primi 2 elementi e non si preoccupa nemmeno di guardare il 'key'. –