Dato un insieme di elementi, come posso dividere la raccolta in 2 sotto-raccolte in base a un predicato?LINQ supporta nativamente la divisione di una raccolta in due?
Si potrebbe fare 2 Dove le ricerche, ma poi il tempo di esecuzione è di 2 * N (che, pur O (n), prende il doppio del tempo e non è, ovviamente, preferito)
IEnumerable<int> even = nums.Where(i => IsEven(i));
IEnumerable<int> odd = nums.Where(i => !IsEven(i));
Si potrebbe fare un singolo passaggio lineare (rifattorizzato in un metodo di estensione qui), ma questo significa che devi trascinare questo codice dappertutto, e più codice personalizzato rende le cose meno manutenibili.
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;
}
Domanda: Vuol LINQ hanno alcun supporto nativo per suddividere una collezione in 1 pass lineare?
Perché è necessario un percorso lineare? –
@SaeedAmiri non è proprio un requisito, e 2 passaggi lineari è abbastanza buono_ nella maggior parte dei casi, ma non sono mai veramente soddisfatto delle prestazioni _abbastanza_bene: P – James