using System.Collections.Generic;
public static IEnumerable<T> ReplaceWhile<T>(IEnumerable<T> source, Func<T, bool> predicate, T subsitute)
foreach(var item in source)
yield return !matching ? item : (matching = predicate(item)) ? subsitute : item;
public static void Main()
var l = new List<int?>{0,0,0,0,0,0,4,5,6,3,0,0,2,3};
var e = ReplaceWhile(l, x => x == 0, (int?)null);
Console.WriteLine(string.Join(",", e));
Console.WriteLine(string.Join(",", e));