アイテムのコレクションがある場合、述語に基づいてコレクションを2つのサブコレクションに分割するにはどうすればよいですか?
2 Where検索を実行できますが、実行時間は2 * Nです(これはO(n)のままですが、2倍の時間がかかり、明らかに好ましくありません)
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つの線形パスに分割するためのネイティブサポートがありますか?