2011-08-12 21 views
5

Mam obserwowalną kolekcję, z której chcę usunąć konkretny element instancji.Usuwanie z kolekcji Observable

np.

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

To działa prawidłowo, jednak, jak to jest związane z usunięciem elementy podrzędne z katalogów, Chcę dynamicznie tworzyć powyższe stwierdzenie zależny od poziomu z katalogów kliknięciu. Więc może chcieć:

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

lub

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

Znam identyfikatora z elementów nadrzędnych, które mam schować na liście, na przykład

0 1 0 lub 1,0

Moje pytanie brzmi jak mogę iść o tworzeniu powyższe stwierdzenie, kiedy nie wiem dokładnie ile przedmiotów nie będą w zbiorach liście?

Dzięki.

+1

Tytuł pytania jest trochę mylący. Być może używasz ObservableCollection specjalnie, ale pytanie nie ma nic wspólnego z ObservableCollection. Problem będzie taki sam dla każdej rekurencyjnej struktury danych, niezależnie od tego, czy jest implementowany za pomocą ObservableCollection, czy tablicy lub listy. – Davy8

Odpowiedz

0

Używałbym funkcji rekursywnych, które mogą dać ci aktualny/bieżący węzeł, i możesz znaleźć związany ObservableCollection i usunąć z niego.

+0

Mam już funkcję rekursywną, która znajduje identyfikator rodzica i wybrany element, po prostu nie wiem, jak wygenerować oświadczenie, aby rzeczywiście usunąć element z kolekcji. –

+0

Biorąc pod uwagę, że struktura kolekcji jest taka sama (tzn. Rodzic ma zawsze podrzędną kolekcję "węzłów", czy nie można użyć tej samej funkcji rekursywnej, aby uzyskać ObservableCollection, której potrzebujesz? –

0

coś takiego:

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

Czasem stara szkoła robi to najlepiej.

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])); 
    } 

w przypadku, gdy nie posiadają „root” YourClass instancji (podejrzewam zrobić, ale na wszelki wypadek) dodać: -

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]); 
    } 
} 

wtedy, jeśli nie chcesz coś mądrego można włączyć te do metod rozszerzenia.

+0

Podobają mi się wersje iteracyjne zamiast rekursywne osobiście. –

Powiązane problemy