Dada una colección de elementos, ¿cómo divido la colección en 2 subcolecciones basadas en un predicado?¿LINQ admite de forma nativa dividir una colección en dos?
Usted podría hacer 2 Donde búsquedas, pero entonces el tiempo de ejecución es de 2 * N (que, sin dejar de O (n), toma el doble de tiempo y, obviamente, no es preferido)
IEnumerable<int> even = nums.Where(i => IsEven(i));
IEnumerable<int> odd = nums.Where(i => !IsEven(i));
Usted podría hacer un solo pase lineal usted mismo (refactorizado en un método de extensión aquí), pero esto significa que tiene que arrastrar este código por todas partes, y más código personalizado hace que las cosas sean menos fáciles de mantener.
public static void SplitOnPred<T>(
this IEnumerable<T> collection,
Func<T, bool> pred,
out IEnumerable<T> trueSet,
out IEnumerable<T> falseSet
) {
List<T> trueSetList = new List<T>();
List<T> falseSetList = new List<T>();
foreach(T item in collection) {
if(pred(item)) {
trueSetList.Add(item);
} else {
falseSetList.Add(item);
}
}
trueSet = trueSetList;
falseSet = falseSetList;
}
Pregunta: ¿Tiene LINQ tienen ningún soporte nativo para dividir una colección de 1 pase lineal?
¿Por qué necesita una ruta lineal? –
@SaeedAmiri no es realmente un requisito, y 2 pasos lineales son lo suficientemente buenos en la mayoría de los casos, pero nunca estoy realmente contento con el desempeño lo suficientemente bueno: P – James