4

これに似た質問がありますが、に関する質問ですEntityCollection<>

EntityCollectionを実装し、リストから1つのアイテムを一度Remove()に削除できるようにします。ただし、のメソッドと同様に、一度に複数のアイテムを削除できる拡張メソッドを実装したいと思います。IList<T>RemoveAll(Predicate<T> match)

1つのアイデアは、リストをループしてアイテムを削除することです。何かのようなもの:

public static void RemoveAll<T>(this EntityCollection<T> collection, Predicate<T> match) where T : EntityObject
{
   foreach (T o in collection)
   {
      if (match(o))
         collection.Remove(o);
   }
}

ただし、繰り返し処理しているコレクションを変更できないため、これにより例外がスローされます。

もう1つのアイデアは、削除するアイテムの一時的なリストを作成し、そのリストをループして、コレクションから各アイテムを削除することです。しかし、これは私には非効率に思えます。より良い実装はありますか?

4

1 に答える 1

9

コメントで述べたように、ここではおそらくセカンダリリストを反復処理することが唯一の安全な選択です。

次のようなもので実装できます。

public static void RemoveAll<T>(this EntityCollection<T> collection,
    Predicate<T> match) where T : EntityObject
{
    if (match == null) {
        throw new ArgumentNullException("match");
    }

    collection.Where(entity => match(entity))
              .ToList().ForEach(entity => collection.Remove(entity));
}
于 2013-02-22T18:55:56.983 に答える