using System.Collections.Generic;
public static void Main()
var list = new[] {'A','B','C'};
foreach(var (el, i, isFirst, isLast) in list.Enumerate()) {
Console.WriteLine($"el={el}, i={i}, isFirst={isFirst}, isLast={isLast}");
foreach(var (el, i, _, _) in list.Enumerate()) {
Console.WriteLine($"el={el}, i={i}");
foreach(var (el, _, _, isLast) in list.Enumerate()) {
Console.WriteLine($"el={el}, isLast={isLast}");
foreach(var entry in list.Enumerate()) {
Console.WriteLine($"element={entry.element}, index={entry.index}");
foreach(var (el, isFirst, isLast) in list.EnumerateDetail()) {
Console.WriteLine($"el={el}, isFirst={isFirst}, isLast={isLast}");
public static class ListExtensions
public static IEnumerable<(T element, int index)> EnumerateIndex<T>(this IEnumerable<T> list) {
return list.Select((el, i) => (el, i));
public static IEnumerable<(T element, int index, bool isFirst, bool isLast)> Enumerate<T>(this IEnumerable<T> list) {
return list.Select((el, i) => (el, i, i == 0, i == len -1));
public static IEnumerable<(T element, bool isFirst, bool isLast)> EnumerateDetail<T>(this IEnumerable<T> collection) {
using var enumerator = collection.GetEnumerator();
var isLast = !enumerator.MoveNext();
var current = enumerator.Current;
isLast = !enumerator.MoveNext();
yield return (current, isFirst, isLast);