2011-08-12 20 views
5

Tengo una colección observable de la que deseo eliminar un elemento de instancia específico.Eliminación de una colección observable

p. Ej.

data[1].ChildElements[0].ChildElements[1].ChildElements.RemoveAt(1);

Esto funciona bien, sin embargo, ya que este es relativa a la supresión de elementos secundarios de un árbol, quiero crear dinámicamente la instrucción anterior depende de qué nivel de la vista de árbol se hace clic. Por lo que podía desear:

data[0].ChildElements[1].ChildElements.RemoveAt(0);

o

data[1].ChildElements.RemoveAt(0);

Sé que los identificadores de los elementos principales que he guardadas en una lista, por ejemplo,

0 1 0 o 1,0

Mi pregunta es ¿cómo hago para la creación de la declaración anterior, cuando no saben exactamente cuántos artículos que van a estar en la colección lista?

Gracias.

+1

El título de la pregunta es un poco engañoso. Puede estar utilizando un ObservableCollection específicamente, pero la pregunta no tiene nada que ver con ObservableCollection. El problema sería el mismo para cualquier estructura de datos recursiva, ya sea que se implemente con un ObservableCollection o una matriz o una lista. – Davy8

Respuesta

0

Usaría las funciones recursivas, que pueden darle el nodo Actual/Actual, y puede encontrar ObservableCollection vinculado y eliminarlo.

+0

Ya tengo una función recursiva que encuentra los identificadores principales y el elemento seleccionado, simplemente no sé cómo generar la declaración para eliminar realmente el elemento de la colección. –

+0

dado que su estructura de Colección es la misma (es decir, el padre siempre tiene una colección de "Nodos" secundarios, ¿no puede usar la misma función recursiva para darle el ObservableCollection que desea? –

0

Algo como esto:

private void RemoveSpecificInstance(IList<int> ids, ObservableCollection<SomeClass> currentCollection) 
    { 
     if (ids.Count == 0) 
     { 
      // The initial collection didn't have children 
      return; 
     } 
     else if (ids.Count == 1) 
     { 
      currentCollection.RemoveAt(ids.Single()); 
     } 
     else 
     { 
      int index = ids.First(); 

      RemoveSpecificInstance(ids.Skip(1).ToList(), currentCollection[index].ChildElements); 
     } 
    } 
1

veces vieja escuela lo hace mejor.

static void RemoveByPath(YourClass currentNode, int[] path) 
    { 
     for (int i = 0; i < path.Length - 1; i++) 
     { 
      currentNode = currentNode.ChildElements[path[i]]; 
     } 
     currentNode.ChildElements.RemoveAt(path[path.Length-1])); 
    } 

en caso de que no tiene una "raíz" YourClass instancia (sospecho que haces, pero por si acaso) agrega: -

static void RemoveByPath(IList<YourClass> data, int[] path) 
{ 
    if (path.Length > 1) 
    { 
     RemoveByPath(data[path[0]], path.Skip(1).ToArray()); 
    } 
    else 
    { 
     data.RemoveAt(path[0]); 
    } 
} 

continuación, si usted quiere algo inteligente es posible que apague estos en métodos de extensión.

+0

me gusta la versión iterativa en lugar del recursivo, personalmente. –

Cuestiones relacionadas