Учитывая набор элементов, как мне разбить коллекцию на 2 подкатегории на основе предиката?
Вы можете делать 2 В тех случаях, когда выполняется поиск, но тогда время выполнения равно 2 * N (которое, хотя и O (n), занимает в два раза больше и, очевидно, не является предпочтительным)
IEnumerable<int> even = nums.Where(i => IsEven(i));
IEnumerable<int> odd = nums.Where(i => !IsEven(i));
Вы можете сделать одиночный линейный проход самостоятельно (реорганизованный в метод расширения здесь), но это означает, что вам нужно перетащить этот код по всему, а более собственный код делает вещи менее удобными.
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;
}
Вопрос: LINQ имеет встроенную поддержку для разбиения коллекции на один линейный проход?