2012-04-15 12 views
17

¿Cómo puedo obtener el n-ésimo elemento de una instancia de LinkedList? ¿Hay una forma integrada o podría necesitar presentar mi propia implementación? Por ejemplo, un método de extensión?¿Cómo obtengo el n-ésimo elemento en LinkedList <T>?

Gracias

+1

Antes que nada, ¿por qué? ¿Seguro que necesitas una lista vinculada? – alexn

+0

Tengo un ejemplo de InsertedSortList que utiliza métodos como InsertAt (int i) en una estructura de datos LinkedList. Es por eso que quería preguntar. – pencilCake

+0

¿Es SO o MSDN Documentation? –

Respuesta

27

El método ElementAt extensión lo hará:

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

No se olvide que esto es una operación O (n), porque LinkedList<T> no proporciona ninguna forma más eficiente de acceder a un elemento por el índice. Si necesita hacer esto regularmente, sugiere que no debe usar una lista vinculada para comenzar.

+8

Microsoft, por favor, agregue la complejidad en la documentación :) –

+0

@Jon no sea quisquilloso, pero ¿es necesario que si implemente 'IList ', la operación de indexación no puede ser 'O (n)'? – nawfal

+1

@nawfal: editará. –

6

Se puede utilizar el método de extensión enumerables ElementAt(). La razón por la que LinkedList no admite el acceso aleatorio de forma nativa se debe a que es una operación bastante ineficiente para la estructura de datos. Si va a hacerlo a menudo, debería pensar en usar una estructura de datos más apropiada.

2

Puede hacerlo con LINQ como en list.ElementAt(n) o list.Skip(n - 1).First(), pero si se encuentra realizando un acceso indexado a una lista vinculada, probablemente esté haciendo algo incorrecto (las listas vinculadas no son compatibles con esta operación). Quizás otra estructura de datos sería más apropiada?

0

que necesitaba para conseguir el segundo elemento de la lista (para actualizar un valor en el 1er elemento basado en el segundo)

Suponiendo que usted está tomando las medidas necesarias para asegurarse de que tienen dos elementos que se pueden simplemente Haga esto:

list.First.Next.Value 
Cuestiones relacionadas