鉴于项目的集合,我如何基于谓词拆分成集2子集?LINQ本身是否支持将一个集合分为两部分?
你可以做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是否有在1个通拆分收取任何原生支持?
为什么你需要一个线性路径? – 2012-08-13 17:04:40
@SaeedAmiri它不是一个真正的需求,以及2线性传递是在大多数情况下_good enough_但我从来没有与_good enough_的表现真的很开心:P – James 2012-08-13 17:06:49