4

我有一个与此类似的问题,但与EntityCollection<>.

EntityCollectionimplements Remove(),允许您一次从列表中删除单个项目。但是,我想实现一个可以一次删除多个项目的扩展方法,类似于IList<T>'sRemoveAll(Predicate<T> match)方法。

一种想法是遍历列表并删除项目。就像是:

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

但是,这将引发异常,因为您无法修改正在迭代的集合。

另一个想法是构建要删除的项目的临时列表,然后遍历列表并从集合中删除每个项目。但是,这对我来说似乎效率低下。有更好的实现吗?

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 回答