2011-08-12 161 views
5

我有一個可觀察的集合,我想從中刪除特定的實例項目。從Observable集合中刪除

例如

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

這工作得很好,但是,因爲這是與從樹視圖中刪除的子元素,我要動態地創建依賴於被點擊一下樹狀的層次上面的語句。所以,我可以想:

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

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

我知道父項目的id的我已經離開儲存在一個列表,例如

0 1 01,0

我的問題是我怎麼去創造的時候我不知道到底有多少項目存在將要在列表中收集上述說法?

謝謝。

+1

問題的標題有點誤導。您可能正在使用ObservableCollection,但問題與ObservableCollection無關。無論是用ObservableCollection還是數組或列表實現,任何遞歸數據結構的問題都是一樣的。 – Davy8

回答

0

我會使用遞歸函數,它可以給你實際/當前節點,你可以找出綁定ObservableCollection並從中刪除。

+0

我已經有一個遞歸函數,它可以找到父ID和選定的項目,我只是不知道如何生成聲明來從集合中實際刪除項目。 –

+0

鑑於你的集合結構是相同的(即父母總是有孩子「節點」的集合,你可以不使用相同的遞歸函數來給你ObservableCollection,你想? –

0

事情是這樣的:

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

有時候老同學做它最好的。

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

的情況下,你沒有「根」 YourClass實例(我懷疑你做,但以防萬一)地址: -

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

那麼如果你想要的東西,聰明的你可能變成這些擴展方法。

+0

我喜歡迭代版本,而不是遞歸,個人。 –