1

Silverlight ツールキットで次のようなコードを見たことがありますが、安全な方法を理解できません。

private void ItemsSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // Update the cache
    if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null)
    {
        for (int index = 0; index < e.OldItems.Count; index++)
        {
            _items.RemoveAt(e.OldStartingIndex);
        }
    }
}

たとえばインデックス 5 からアイテムを削除すると、_itemsインデックス 5 以降のコレクション内のすべてのアイテムの現在のインデックスが以前よりも 1 つ少なくなることはありませんか? では、このコードのように「古い」インデックスを使用してアイテムを継続的に削除することは、どのように安全なのでしょうか?

なぜこれが機能するのかを本当に理解したいです。

何か案は?

4

1 に答える 1

4

このコードは、特定の開始インデックスから連続するアイテムのセットを削除しているように見えます。remove 呼び出しを注意深く読むと、次のようになります。

_items.RemoveAt( e.OldStartingIndex );  

定数インデックスからアイテムを繰り返し削除していることに気付くでしょう。これは、連続した範囲内の項目を削除してリストを折りたたんでいることを意味します。これは非常に正しいかもしれません-それがコードの意図であると仮定します。

ループは指定された回数だけ実行されe.OldItems.Countます。そのため (おそらく)、特定のインデックスから開始して削除するアイテムの数が通知されます。

一般的な慣行として、コレクションからアイテムを削除する方法には注意が必要です。これには、次の 2 つの理由があります。

  1. アイテムを削除すると、アイテム インデックスは実際に変更されます。そのため、アイテム インデックスの位置がずれることによるエラーを回避するように注意する必要があります。
  2. (foreach ループまたは明示的な IEnumerator を使用した場合のように) 反復処理中にリストを変更すると、例外が発生します。反復中にリストを変更 (追加または削除) することはできません。反復子が無効になります。
于 2009-12-10T18:32:35.410 に答える