Я понимаю, что MoveNext
вызывает исключение.
Я попытался написать метод, который обходит последовательность и пытается игнорировать MoveNext
исключения.Однако я не уверен, что MoveNext
продвигает позицию, когда генерирует исключение, так что это может быть бесконечный цикл.Это также плохая идея, потому что мы будем полагаться на детали реализации.
Но это просто так весело!
public static IEnumerable<T> SafeWalk<T> (this IEnumerable<T> source)
{
var enumerator = source.GetEnumerator();
bool? hasCurrent = null;
do {
try {
hasCurrent = enumerator.MoveNext();
} catch {
hasCurrent = null; // we're not sure
}
if (hasCurrent ?? false) // if not sure, do not return value
yield return enumerator.Current;
} while (hasCurrent ?? true); // if not sure, continue walking
}
foreach (var file in Directory.EnumerateFiles("c:\\", "*", SearchOption.AllDirectories)
.SafeWalk())
{
// ...
}
Это будет работать, только если выполняются следующие условияЗначение true для реализации этого итератора в рамках инфраструктуры (см. FileSystemEnumerableIterator<TSource>
в Reflector для справки):
MoveNext
улучшает свою позицию при сбое; - Когда
MoveNext
завершается неудачей в последний разэлемент, последующие вызовы будут возвращать false
вместо выдачи исключения; - Это поведение согласованно для разных версий .NET Framework;
- Я не допустил логических или синтаксических ошибок.
Даже если это работает, пожалуйста, никогда не используйте его в производстве!
Но мне действительно интересно, если это работает.