2017-04-03 13 views
-1

私のスクリプトには2つの問題があり、理解を助ける必要があります。リスト内の一致するノードをすべて削除します

ifステートメントは、元のリストに一致する値を探します。次にそれを削除します。これは何らかの理由で機能しません。 items.Remove(item)は実際にアイテムを削除しません。

else文が機能します。しかし、私はこれをすべて1行で行うことができると感じています。

思考?可能であれば、私はそれをリストにすることを避けたいと思います。その元はObservableCollectionです。

var items = TreeViewCollection.ToList(); 

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

更新:Iveはもう少し意味をなさせるようにコードを更新しました。

私の目標は、これを1行にすることです。

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

はい私はそれがifの内部に入っているかどうかを見るためにコードをデバッグしました。私はコードにデバッグして、それがelseの内部に入るかどうかを調べました。 elseは期待通りに動作しますが、ifは動作しません。 –

答えて

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); 
関連する問題