CSharp examples for System.Collections:ICollection
Remove Where in ICollection
using System.Collections.Generic; using System.Collections; using System;/* w ww . ja va2 s . c o m*/ public class Main{ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] internal static ICollection<T> RemoveWhere<T>(ICollection<T> collection, Predicate<T> predicate) { if (collection == null) throw new ArgumentNullException("collection"); if (predicate == null) throw new ArgumentNullException("predicate"); IList<T> list = collection as IList<T>; if (list != null) { T item; int i = -1, j = 0; int listCount = list.Count; List<T> removed = new List<T>(); // Remove item where predicate is true, compressing items to lower in the list. This is much more // efficient than the naive algorithm that uses IList<T>.Remove(). while (j < listCount) { item = list[j]; if (predicate(item)) { removed.Add(item); } else { ++i; if (i != j) list[i] = item; } ++j; } ++i; if (i < listCount) { // remove items from the end. if (list is IList && ((IList)list).IsFixedSize) { // An array or similar. Null out the last elements. while (i < listCount) list[i++] = default(T); } else { // Normal list. while (i < listCount) { list.RemoveAt(listCount - 1); --listCount; } } } return removed; } else { // We have to copy all the items to remove to a List, because collections can't be modifed // during an enumeration. List<T> removed = new List<T>(); foreach (T item in collection) if (predicate(item)) removed.Add(item); foreach (T item in removed) collection.Remove(item); return removed; } } }