Как было указано в другом ответе, - это метод MoveNext()
, и у вас есть доступ к нему для всех перечислимых элементов через интерфейс IEnumerator<T>
, возвращаемый вызовом IEnumerable<T>.GetEnumerator()
. Тем не менее, работа с MoveNext()
и Current
может показаться несколько «низкоуровневой».
Если вы предпочитаете цикл foreach
для обработки вашей коллекции getAlphabet()
, вы можете написать метод расширения, который возвращает элементы из любого перечисляемого в парах по два:
public static IEnumerable<T[]> InPairsOfTwo<T>(this IEnumerable<T> enumerable)
{
if (enumerable.Count() < 2) throw new ArgumentException("...");
T lastItem = default(T);
bool isNotFirstIteration = false;
foreach (T item in enumerable)
{
if (isNotFirstIteration)
{
yield return new T[] { lastItem, item };
}
else
{
isNotFirstIteration = true;
}
lastItem = item;
}
}
Вы бы использовали его следующим образом:
foreach (char[] letterPair in getAlphabet().InPairsOfTwo())
{
char currentLetter = letterPair[0],
nextLetter = letterPair[1];
Console.WriteLine("# {0}, {1}", currentLetter, nextLetter);
}
И вы получите следующий вывод:
# A, B
# B, C
(Обратите внимание, что хотя вышеприведенный метод расширения возвращает пары из двух элементов в каждой, пары перекрываются на один элемент! По сути, вы получаете каждый элемент, а также прогноз. Если вам нужен метод расширения чтобы вернуть последний элемент самостоятельно, вы можете адаптировать его, адаптировав используемый метод буферизации.)