Скажем, у меня есть IEnumerable. Например, {2,1,42,0,9,6,5,3,8}.
Мне нужно получить «серии» элементов, соответствующих предикату. Например, если мой предикат был
bool isSmallerThanSix(int number){...}
Я хотел бы получить следующий вывод: {{2,1},{0},{5,3}}
Есть ли встроенная функция, которая выполняет это?
Пока у меня это:
public static IEnumerable<IEnumerable<T>> GetSequences<T>(this IEnumerable<T> source,
Func<T, bool> selector) {
if (source == null || selector == null) {
yield break;
}
IEnumerable<T> rest = source.SkipWhile(obj => !selector(obj));
while (rest.Count() > 0) {
yield return rest.TakeWhile(obj => selector(obj));
rest = rest
.SkipWhile(obj => selector(obj))
.SkipWhile(obj => !selector(obj));
}
}
который, кажется, работает, но был написан мной посреди ночи и, таким образом, неэффективен пятнадцатью способами со вторника. Есть ли лучший, желательно встроенный (и, следовательно, проверенный) способ?
Большое спасибо за ваше время,
Риа.