给定一个项目集合,如何根据谓词将集合拆分为 2 个子集合?
你可以做 2 Where 搜索,但是运行时间是 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 是否对在 1 个线性通道中拆分集合有任何原生支持?