2017-04-03 100 views
-1

我的腳本有兩個錯誤,我需要幫助理解。刪除列表中的所有匹配節點

if語句查找原始列表中的匹配值。然後將其刪除。由於某種原因,這不起作用。 items.Remove(item)實際上並沒有刪除該項目。

else語句有效。但我有一種感覺,我可以在一行中完成這一切。

想法?如果可能的話,我想避免將它列入清單。它最初是一個ObservableCollection

var items = TreeViewCollection.ToList(); 

if (items.Contains(SelectedTreeViewItem)) 
    items.Remove(SelectedTreeViewItem); 
else 
    items.ForEach(e=>e.Nodes.Remove(SelectedTreeViewItem)); 

更新:我更新了代碼,使一點更有意義。

我的目標是把它做成一行。

if (TreeViewCollection.Contains(SelectedTreeViewItem)) 
    TreeViewCollection.Remove(SelectedTreeViewItem); 
else 
    TreeViewCollection.ToList().ForEach(e=>e.Nodes.Remove(SelectedTreeViewItem)); 
+0

我不明白你的問題。對'items.Remove()'的調用應該很好地移除該項目。但它從'items'列表中刪除。您是否希望它從「TreeViewCollection」對象中移除?你需要提供一個好的[mcve],並精確地解釋代碼的功能,以及你想要它做什麼。 –

+0

你是否通過代碼進行調試,並確保它進入'if'? –

+0

是的,我沒有調試代碼,看看它是否在裏面,如果它確實。我甚至調試了代碼以查看它是否進入其他內部,並且確實如此。其他的按預期工作,但如果沒有。 –

回答

0

創建一個新的列表是適得其反。 SelectedTreeViewItem將從列表中刪除,但不會從原始收集中刪除。

ForEach不是IEnumerable的擴展方法,它是List<T>類的常用方法。它返回void,所以它只能在Linq方法鏈的末尾。使用foreach使代碼更簡單,並明確指出其意圖:

bool del = TreeViewCollection.Remove(SelectedTreeViewItem); 
if (false == del) 
    foreach(var t in TreeViewCollection) 
     t.Nodes.Remove(SelectedTreeViewItem);