是否可以在EntityCollection <T>上实现RemoveAll()?

Mik*_*sen 4 .net c# linq entity-framework

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

EntityCollection实现Remove(),允许您一次从列表中删除单个项目.不过,我想实现的扩展方法,可以消除在一次多个项目,类似IList<T>RemoveAll(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);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,这将抛出异常,因为您无法修改正在迭代的集合.

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

Fré*_*idi 8

正如我在评论中所说,迭代二级列表可能是这里唯一安全的选择.

您可以使用以下内容实现它:

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));
}
Run Code Online (Sandbox Code Playgroud)