Click here to Skip to main content
15,897,519 members
Articles / Mobile Apps

Custom Enumerators

Rate me:
Please Sign up or sign in to vote.
4.25/5 (7 votes)
30 Aug 2008CPOL3 min read 67.5K   216   30  
Modify the behaviour of any enumerator to make it circular, constrained or stepped. Also reversible enumerator.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace CircularEnumDemo
{
    class Program
    {
        const int max = 15;  // Max number of iterations to stop circular enumerator

        static void Main(string[] args)
        {
            SortedList<int, string> list = new SortedList<int,string>();

            list.Add(1, "one");
            list.Add(2, "two");
            list.Add(3, "three");
            list.Add(4, "four");
            list.Add(5, "five");
            list.Add(6, "six");
            list.Add(7, "seven");
            list.Add(8, "eight");
            list.Add(9, "nine");
            list.Add(10, "ten");

            Console.WriteLine("Dictionary circular enumeration:");
            int i = 0;
            foreach (KeyValuePair<int, string> pair in Enumerators.CircularEnum(list))
            {
                Console.WriteLine("   " + pair.ToString());
                if (++i >= max)
                    break;   // stop circular enumerator, will be infinite if not
            }
            Console.WriteLine("   (stopped)\r\n");

            Console.WriteLine("Dictionary values circular enumeration:");
            i = 0;
            foreach (string value in Enumerators.CircularEnum(list.Values))
            {
                Console.WriteLine("   " + value.ToString());
                if (++i >= max)
                    break;   // stop circular enumerator, will be infinite if not
            }
            Console.WriteLine("   (stopped)\r\n");

            Console.WriteLine("Reverse enumeration:");
            foreach (string value in Enumerators.ReverseEnum(list.Values))
            {
                Console.WriteLine("   " + value.ToString());
            }
            Console.WriteLine("   (finished)\r\n");

            Console.WriteLine("Constrained enumeration (2,5):");
            foreach (KeyValuePair<int, string> pair in Enumerators.ConstrainedEnum(list, 2, 5))
            {
                Console.WriteLine("   " + pair.ToString());
            }
            Console.WriteLine("   (finished)\r\n");

            Console.WriteLine("Stepped enumeration (3):");
            foreach (int value in Enumerators.SteppedEnum(list.Keys, 3))
            {
                Console.WriteLine("   " + value.ToString());
            }
            Console.WriteLine("   (finished)\r\n");

            Console.WriteLine("Combined Constrained(2,6)-Stepped(3)-Reverse-Circular enumeration:");
            i = 0;
            foreach (int value in Enumerators.ConstrainedEnum(Enumerators.SteppedEnum(Enumerators.CircularEnum(Enumerators.ReverseEnum(list.Keys)), 3), 2, 6))
            {
                Console.WriteLine("   " + value.ToString());
                if (++i >= max * 2)
                    break;   // stop circular enumerator, will be infinite if not
            }
            Console.WriteLine("   (finished)");

            Console.ReadKey();
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
Peru Peru


Computer Electronics professional, Software Architect and senior Windows C++ and C# developer with experience in many other programming languages, platforms and application areas including communications, simulation systems, PACS/DICOM (radiology), GIS, 3D graphics and HTML5-based web applications.
Currently intensively working with Visual Studio and TFS.

Comments and Discussions