質問

私は汎用の一覧をしているところ除項目を利用して行われた行 List.Remove(Object).って削除もしくは第五項ん除去に失敗した場合には、無くなるわけではありませんでクリックします。見られるとは思えませんどん削除が思って削除項目失敗した場合にの商品です。

どんなことが原因でしょうか?み、ドキュメント List(Of T).Remove, されているとは思いませんが、指定アルゴリズムに彼らの使用を削除します。

役に立ちましたか?

解決

Removeは、あなたのオブジェクトに.Equalsを呼び出すことに基づいて一致する予定です。指定されたオブジェクトのデフォルトでは、それが唯一ののと同じのオブジェクトと一致します。あなたは、彼らが同じオブジェクトでなくても同等と見なされるために、同じプロパティを持つ2つのオブジェクトをしたい場合は、Equalsメソッドをオーバーライドして、そこにあなたのロジックを配置する必要があります。

しかし、別の良いオプションがRemoveAllを使用して、匿名デリゲートや、あなたが探している基準にラムダ式に渡すことです。例えば:ます。

customers.RemoveAll(customer => customer.LastName.Equals(myCustomer.LastName));

もちろん、あなたが本当にを削除したい場合にのみ動作するすべてのの一致するアイテム、および/またはあなたが特定している場合にのみ一致するものが存在します。

他のヒント

あなたは、リストから項目を削除し、あなたがそれの前のものを削除するよう削除1後のアイテムのインデックスは-1によって変わることを覚えておくことがインデックス化ベースの方法を使用している場合。

あなたのリストにどのように多くの項目がありますか?どのようにあなただけをループ、それらを削除していますか?これらは、0ベースのリストである点に注意してください。あなたは整数でループするための任意の並べ替えをやっている場合は、項目を削除しているとして、それが動作しない場合があります。

原則としてすべきではないのcollectionを変更することはループを、のみの項目の中のことです。の問題を除項目内の各ループでの変更はコレクションはループを妨害する、リストの数や繰り返します。

共通の解決策に

  1. ループコレクションの後退なので干渉の反復子にな影響を与える実行
  2. 新しいコレクションを修正することができコループ以上です。

ループ逆:

この拡張手法を取り入れ Collection(Of T) (を使用してくださ List(Of T), ものリストクラスが既に公開し RemoveAll 方法は基本的には同じもの).
今ループは後進の正当性をチェック項目コレクションに渡される内容に基づいてラムダ機能です。一致する場合、それまでの取り外してください。

<Extension()>
Public Sub RemoveEach(Of T)(ByRef col As Collection(Of T),
                            ByVal match As Func(Of T, Boolean))
    For i = col.Count - 1 To 0 Step -1
        If match(col(i)) Then col.RemoveAt(i)
    Next
End Sub

その利用のようになります:

Dim col = New Collection(Of Integer)({1, 2, 3, 4}.ToList)
col.RemoveEach(Function(i) (i Mod 2) = 0)
'Produces list of 1 & 3

新しいコレクション

での効率化を追跡に指数除項目を使用 RemoveAt の代わりに Remove するオブジェクトをチェックの回収のための試合はこのオブジェクトです。ただし、本当に欲しいという工程で除去の確認や自動更新の解除-設定を、Forループまで電話 ToList の収集を創造することで、新たに一覧です。そして、できるループのリストアイテムを見つけるために、必要とするから削除されます。すべてのオブジェクトで安全な取り外しからの回収ではありませんので、現在列挙します。

<Extension()>
Public Sub RemoveEachObject(Of T)(ByRef col As Collection(Of T), 
                                  ByVal match As Func(Of T, Boolean))
    For Each o As T In col.ToList()
        If match(o) Then col.Remove(o)
    Next
End Sub

詳細は、チェックアウトはこの 回答から削除リスト内の"foreach'ループ.

あなたは要素を削除するためにforループを使用している場合、あなたはそれがコレクション、リストやnumerableオブジェクトに適している、foreachの使用を検討してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top