删除列表中的所有匹配节点

时间:2017-04-03 19:44:04

标签: c# linq list

我的脚本有两个问题需要帮助理解。

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

1 个答案:

答案 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);