2010-02-07 13 views
6

Tengo una Lista enlazada de nodos, cada uno almacenando una Lista enlazada de bordes. Quería hacer algo en la línea deC#: ¿Por qué LinkedList no tiene un método RemoveAll que toma un predicado?

nodes.RemoveAll(n => n.edges.Count == 0) 

Pero sin RemoveTodo eso vale. No entiendo por qué no lo tiene, ya que otras colecciones sí lo tienen. Esto tendría que iterar a través de todos los elementos y eliminar solo uno a la vez de lo que yo entiendo, lo que no sería malo para una lista vinculada.

ahora tengo que hacer esto en su lugar:

for (LinkedListNode<MyNode> n2 = nodes.First; n2 != null;) 
{ 
    LinkedListNode<MyNode> temp = n2.Next; 
    if (n2.Value.edges.Count == 0) 
     nodes.Remove(n2); 
    n2 = temp; 
} 

Mientras que funciona, que hace las cosas parecen más complicadas de lo que son.

+0

Ya se le preguntó - http://stackoverflow.com/questions/133487/how-do-i-remove-elements-from-a-linkedlist-in-c-that-match- a-given-criteria – ChrisF

+2

@Chri sF: No es exactamente lo mismo; esa pregunta solo trataba de eliminar un elemento, no todos los elementos. –

+0

Quizás la creación de una nueva LinkedList con solo Edges.Count> 0 sea más rápida (en lugar de hacer todas esas acciones de eliminación en la lista anterior). La solución de Mark Byers a continuación servirá. – Zyphrax

Respuesta

8

No puedo decir por qué ese método no existe. Parecería un método útil de tener. Puede agregarlo usted mismo usando un método de extensión. Aquí está mi (probablemente mal, y no probado) intento de hacer eso:

public static class LinkedListExtensions 
{ 
    public static void RemoveAll<T>(this LinkedList<T> linkedList, 
            Func<T, bool> predicate) 
    { 
     for (LinkedListNode<T> node = linkedList.First; node != null;) 
     { 
      LinkedListNode<T> next = node.Next; 
      if (predicate(node.Value)) 
       linkedList.Remove(node); 
      node = next; 
     } 
    } 
} 

entonces funciona:

nodes.RemoveAll(n => n.edges.Count == 0); 

alternativa usted puede invertir el criterio para seleccionar los elementos que desea conservar y hacer una nueva LinkedList de ellos:

nodes = new LinkedList<MyNode>(nodes.Where(n => n.edges.Count != 0)); 
Cuestiones relacionadas