アイテムのコレクションがある場合、コレクションを述語に基づいて2つのサブコレクションに分割するにはどうすればよいですか?LINQはネイティブでコレクションを2つに分割することをサポートしていますか?
あなたは2件の検索を行うことができますが、その後の実行時間は2 *
IEnumerable<int> even = nums.Where(i => IsEven(i));
IEnumerable<int> odd = nums.Where(i => !IsEven(i));
あなたが行うことができます(まだO(n)は、二倍の時間がかかるとは明らかに有利ではありませんが、)N (ここでは拡張メソッドにリファクタリングしています)、これはあなたがこのコードを全部ドラッグしなければならないことを意味し、より多くのカスタムコードは物事を保守しにくくします。
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つのリニアパスでコレクションを分割するための任意のネイティブサポートを持っていますか?
なぜ1つの線形パスが必要ですか? –
@SaeedAmiriその必要条件ではなく、2回のリニアパスが_good_十分です_ほとんどの場合、私は決して満足できるパフォーマンスではありません:P – James