2011-08-12 19 views
5

Belirli bir örnek öğesini kaldırmak istediğimde gözlemlenebilir bir koleksiyona sahibim.Gözlemlenebilir koleksiyondan silme

örn.

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

Bu, bu bir ağaç görüntüsü üzerinde alt öğelerini silme ile ilgili olarak ince, ancak, ben dinamik tıklandığında hangi ağaç düzeyi bağımlı yukarıdaki ifadeyi oluşturmak istiyorum çalışır. Bu yüzden tercih edebilir:

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

veya

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

Ben mesela ben bir listede uzakta sakladığınız ebeveyn öğelerin kimliklerini bilmek

0 1 0 veya 1,0

Sorum ben liste koleksiyonunda olacaksa tam olarak kaç öğe bilmiyorum yukarıdaki ifadeyi oluşturmanın yolu nedir nasıl?

Teşekkürler.

+1

Sorunun başlığı biraz yanıltıcıdır. Özellikle bir ObservableCollection kullanıyor olabilirsiniz ama sorunun ObservableCollection ile ilgisi yoktur. Sorun, bir ObservableCollection veya bir dizi veya bir Liste ile uygulanmış olsun, herhangi bir özyinelemeli veri yapısı için aynı olacaktır. – Davy8

cevap

0

Size Geçerli/Geçerli düğümü verebilen Yinelemeli işlevler kullanırım ve bağlı Gözlemlenebilir Diziyi bulabilir ve buradan kaldırabilirsiniz. Böyle

+0

Ebeveyn kimliğini ve seçili öğeyi bulan bir özyinelememe işlevi zaten var, sadece öğeyi koleksiyondan silmek için deyimi nasıl üreteceğimi bilmiyorum. Koleksiyon yapınızın –

+0

verilmiş olması (yani ebeveyn her zaman çocuk "Düğümleri" koleksiyonuna sahiptir, sizin istediğiniz ObservableCollection vermek için aynı özyinelemeli işlevi kullanamazsınız? –

0

şey:

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

Bazen eski okul iyi yapar. durumunda

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

bir "Kök" YourClass örneği (sanıyorum her ihtimale karşı yapmak ama) yok ekleyin: -

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

sonra akıllıca bir şey istemek yaparsanız çevirmek olabilir Bunlar uzatma yöntemlerine.

+0

Özyinelemeli olarak yinelemeli sürüm yerine i. –

İlgili konular