Biorąc pod uwagę kolekcję przedmiotów, w jaki sposób podzielić kolekcję na dwie pod-kolekcje na podstawie predykatu?Czy LINQ natywnie obsługuje dzielenie kolekcji na dwie części?
Można do 2, w którym wyszukiwanie, ale czas pracy wynosi 2 * N (która jednocześnie O (n) jest dwa razy długo i nie jest oczywiście korzystny)
IEnumerable<int> even = nums.Where(i => IsEven(i));
IEnumerable<int> odd = nums.Where(i => !IsEven(i));
Można zrobić pojedyncza liniowa przepustka (tutaj refaktoryzowana w metodę rozszerzenia), ale oznacza to, że musisz przeciągnąć ten kod do końca, a więcej niestandardowego kodu sprawia, że rzeczy są mniej łatwe w utrzymaniu.
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;
}
Pytanie: Czy LINQ jakieś natywne wsparcie dla podziału kolekcji w 1 liniowym Pass?
Dlaczego potrzebujesz jednej ścieżki liniowej? –
@SaeedAmiri nie jest tak naprawdę wymogiem, a 2 liniowe przebiegi są wystarczająco dobre w większości przypadków, ale nigdy nie jestem naprawdę zadowolony z _good wystarczającej wydajności: P – James