CSharp examples for System.Collections:ICollection
Removes all the items in the collection that satisfy the condition defined by .
using System.Collections.Generic; using System.Collections; using System;//ww w . ja va2s . c o m public class Main{ /// <summary> /// Removes all the items in the collection that satisfy the condition /// defined by <paramref name="predicate"/>. /// </summary> /// <remarks>If the collection if an array or implements IList<T>, an efficient algorithm that /// compacts items is used. If not, then ICollection<T>.Remove is used /// to remove items from the collection. If the collection is an array or fixed-size list, /// the non-removed elements are placed, in order, at the beginning of /// the list, and the remaining list items are filled with a default value (0 or null).</remarks> /// <param name="collection">The collection to check all the items in.</param> /// <param name="predicate">A delegate that defines the condition to check for.</param> /// <returns>Returns a collection of the items that were removed. This collection contains the /// items in the same order that they orginally appeared in <paramref name="collection"/>.</returns> [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; } } }