public static IEnumerable <EnumeratedItem <T> > WithDescriptions <T>(this IEnumerable <T> items) { // To avoid evaluating the whole collection up-front (which may be undesirable, for example // if the collection contains infinitely many members), read-ahead just one item at a time. // Get the first item var enumerator = items.GetEnumerator(); if (!enumerator.MoveNext()) { yield break; } T currentItem = enumerator.Current; int index = 0; while (true) { // Read ahead so we know whether we're at the end or not bool isLast = !enumerator.MoveNext(); // Describe and yield the current item EnumeratedItemDescription description = (index % 2 == 0 ? EnumeratedItemDescription.Odd : EnumeratedItemDescription.Even); if (index == 0) { description |= EnumeratedItemDescription.First; } if (isLast) { description |= EnumeratedItemDescription.Last; } if (index > 0 && !isLast) { description |= EnumeratedItemDescription.Interior; } yield return(new EnumeratedItem <T>(index, currentItem, description)); // Terminate or continue if (isLast) { yield break; } index++; currentItem = enumerator.Current; } }
public bool Is(EnumeratedItemDescription description) { return((Description & description) == description); }
public EnumeratedItem(int index, T item, EnumeratedItemDescription description) { Index = index; Item = item; Description = description; }