2009-08-17 17 views
5

Necesito repetir en un LinkedList<T> (en .NET 2.0) y eliminar todos los elementos de acuerdo con un criterio determinado. Fue manera fácil en virtud de Java, ya que podría hacer lo siguiente:LinkedList <T> (2.0): eliminar elementos iterativamente

Iterator<E> i = list.iterator(); 
while (i.hasNext()) { 
    E e = i.next(); 
    if (e == x) { 
     // Found, so move it to the front, 
     i.remove(); 
     list.addFirst(x); 
     // Return it 
     return x; 
    } 
} 

Por desgracia, en el comportamiento de .NET de IEnumerator<T> (el equivalente de Iterator<E>) no hay remove método para eliminar el elemento actual de la colección. Además, en el LinkedList<T> no hay forma de acceder a un elemento en un índice dado, para completar la tarea iterando de la última a la primera.

¿Tienes alguna idea de cómo hacerlo? ¡Muchas gracias!

+3

¿Por qué es esto una wiki de la comunidad? No es algo subjetivo, aquí hay una respuesta definitiva. –

Respuesta

11

Esto eliminará todos los nodos que coinciden con un criterio, en un bucle a través de la lista enlazada

LinkedListNode<E> node = list.First; 

while (node != null) 
{ 
    var next = node.Next; 
    if (node.Value == x) { 
     list.Remove(e); 
    } 
    node = next; 
} 

yo creo que es lo que estás tratando ... También agrega de nuevo en el nodo al principio de la lista (por lo que el código Java no quitar todos los nodos, sino más bien movido la primera coincidencia al principio de la lista). Eso sería fácil de hacer con este enfoque, también.

+0

¿No debería ser list.Remove (node)? –

1

En realidad es mucho más fácil en C#.

function PlaceAtHead(<T> x) 
{ 
    list.Remove(x); 
    list.AddFirst(x); 
    return x; 
} 
+0

No es lo que OP pidió ... –

+0

Esto no tiene nada que ver con la pregunta ... –

+0

No lo he intentado todavía, pero creo que esto aumentará una excepción, debido al Enumerador abierto ... – Antonello

1

Una opción fea es repetir en su lista, encontrar todos los artículos que se aplican y almacenarlos en una lista. A continuación, iterar a través de la segunda lista y llamar a eliminar en su ListaEnlazada ...

Estoy esperando que alguien más tiene una solución más elegante :)

+0

Realmente me gusta esa idea ... – Unsliced

+0

Eso es lo que pensé también, pero, aparte de la elegancia, no podría funcionar en todas las condiciones, ya que 2 nodos de la lista podrían ser iguales ... – Antonello

+0

Puse una versión de un pase abajo a continuación, que manejará los duplicados también. Se basa en el uso de LinkedList .Remove (LinkedListNode ) –

0

Sólo una pequeña adición a Reed Copsey's answer con un predicado:

public static T MoveAheadAndReturn<T>(LinkedList<T> ll, Predicate<T> pred) 
    { 
     if (ll == null) 
      throw new ArgumentNullException("ll"); 
     if (pred == null) 
      throw new ArgumentNullException("pred"); 


     LinkedListNode<T> node = ll.First; 
     T value = default(T); 

     while (node != null) 
     { 
      value = node.Value; 
      if (pred(value)) 
      { 
       ll.Remove(node); 
       ll.AddFirst(node); 
       break; 
      } 
      node = node.Next; 
     } 

     return value; 
    } 
Cuestiones relacionadas