2012-04-15 3 views
17

Come posso ottenere l'n-esimo elemento di un'istanza LinkedList? Esiste un modo integrato o potrei dover introdurre la mia implementazione? Ad esempio un metodo di estensione?Come si ottiene l'elemento n-esimo in LinkedList <T>?

Grazie

+1

Prima di tutto, perché? Certo hai bisogno di una lista collegata? – alexn

+0

Ho un esempio di InsertedSortList che utilizza metodi come InsertAt (int i) su una struttura di dati LinkedList. Ecco perché volevo chiedere. – pencilCake

+0

È la documentazione SO o MSDN? –

risposta

27

Il metodo ElementAt estensione lo farà:

// This is 0-based of course 
var value = linkedList.ElementAt(n); 

Non dimenticate questa è un'operazione O (n), perché LinkedList<T> non fornisce alcun modo più efficiente di accesso a un oggetto in base all'indice. Se hai bisogno di farlo regolarmente, suggerisce che non dovresti usare una lista collegata per iniziare.

+8

Microsoft, per favore, aggiungi la complessità nella documentazione :) –

+0

@Jon non essere nitpicking, ma è necessario che se implemento 'IList ', l'operazione di indicizzazione non può essere 'O (n) '? – nawfal

+1

@nawfal: verrà modificato. –

6

È possibile utilizzare l'ElementAt() metodo di estensione enumerabile. La ragione per cui LinkedList non supporta l'accesso casuale in modo nativo è perché è un'operazione piuttosto inefficiente per la struttura dei dati. Se lo farai spesso dovresti pensare a usare una struttura dati più appropriata.

2

È possibile farlo con LINQ come in list.ElementAt(n) o list.Skip(n - 1).First(), ma se si trova l'accesso indicizzato in un elenco collegato probabilmente si sta facendo qualcosa di sbagliato (gli elenchi collegati non supportano in modo efficiente questa operazione). Forse un'altra struttura di dati sarebbe più appropriata?

0

avevo bisogno per ottenere il secondo elemento della mia lista (per aggiornare un valore al 1 ° elemento in base al 2 °)

Supponendo che si sta prendendo le misure necessarie per garantire che si hanno due elementi si può semplicemente A fare questo:

list.First.Next.Value