Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
 public bool Is(EnumeratedItemDescription description)
 {
     return((Description & description) == description);
 }
Beispiel #3
0
 public EnumeratedItem(int index, T item, EnumeratedItemDescription description)
 {
     Index       = index;
     Item        = item;
     Description = description;
 }