给定一个项目集合,如何根据谓词将该集合拆分为 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 次线性传递中分割集合的本机支持?
LINQ 是否有对在 1 次线性传递中分割集合的本机支持?
没有内置方法可以根据谓词将集合拆分为两个版本。您需要使用自己的方法,类似于您发布的方法。
最接近的内置方法是GroupBy http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby.aspx (or ToLookup http://msdn.microsoft.com/en-us/library/bb549073.aspx)。您可以按奇数或偶数分组:
var groups = nums.GroupBy(i => IsEven(i));
这将根据数字是奇数还是偶数分为两个“组”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)