Стандартные методы, предоставляемые Enumerable
, недостаточно мощны, чтобы легко кодировать цикл while
. Если вы хотите переписать код, вызвав какой-то метод общего назначения, вам также потребуется реализовать метод общего назначения. Ваша проблема может быть хорошо решена, если вы добавите метод Generate
:
EnumerableEx.Generate(path, path =>
Path.GetDirectoryName(path) != Path.GetPathRoot(path)
? Path.GetDirectoryName(path) : null);
Идея метода Generate
состоит в том, что он продолжает неоднократно вызывать предоставленную лямбда-функцию для генерации нового состояния (в данном случае path
), пока не вернет null
. Метод возвращает все сгенерированные значения по ходу. Вы можете написать Generate
так:
static IEnumerable<T> Generate<T>(T initial, Func<T, T> next) {
T current = initial;
while(true) {
current = next(current);
if (current == default(T)) return;
yield return current;
}
}
Метод по существу просто скрывает шаблон многократного использования, который использовался в вашем исходном методе. Определенное поведение передается как функция, поэтому вы можете использовать этот метод для разных целей.