Как насчет:
public static IEnumerable<R> ToSequence<T, R>(this T self,
Func<T, R> yielder, Func<R, bool> condition)
{
R result = yielder(self, R);
while (condition(result))
{
yield return result;
}
}
, а затем используйте его примерно так:
foreach (var line in reader.ToSequence(
(r) => r.ReadLine(),
(line) => line != null))
{
// do some stuff to line
}
или вы бы предпочли:
foreach (var line in reader.NotNull(r => r.ReadLine()))
{
// do some stuff to line...
}
, который может быть определен как:
public static IEnumerable<R> NotNull<T, R>(this T self, Func<T, R> yielder)
{
return self.ToSequence(yielder, (r) => r != null);
}