Мой совет: вообще не связывайтесь с счетчиками. Охарактеризуйте свою проблему как последовательность операций над последовательностями. Напишите код для выражения этих операций. Пусть операторы последовательности позаботятся об управлении перечислителями.
Итак, давайте посмотрим, правильно ли я понял. У вас есть две последовательности. Допустим, {2, 3, 5, 7, 12} и {"лягушка", "жаба"}. Логическая операция, которую вы хотите выполнить, скажем: «пройти первую последовательность. Каждый раз, когда вы найдете число, делимое на три, получите следующий элемент во второй последовательности. Сделайте что-нибудь с полученной парой (число, амфибия)».
Легко сделано. Сначала отфильтруйте первую последовательность:
var filtered = firstSequence.Where(x=>x%3 == 0);
Затем, отфильтруйте отфильтрованную последовательность со второй последовательностью:
var zipped = filtered.Zip(
secondSequence,
(y, z)=> new {Number = x, Amphibian = y});
А теперь вы можете перебирать сжатую последовательность и делать с парами все, что вы хотите:
foreach(var pair in zipped)
Console.WriteLine("{0} : {1}", pair.Number, pair.Amphibian);
Легко, без излишеств, без переписчиков.