ITERINDEX - A Code Snippet

This article explains Named Iterator and Indexer pair using a nested class.

Introduction

My intention for writing this article is to describe an iterIndex Code Snippet and its usage. But I will explain a bit of Code Snippets to make the article simpler.

What is Code Snippet

Visual Studio provides a feature called Code Snippets. You can use Code Snippets to type a short alias, and then expand it into a common programming construct, i.e. predefined code.

For example, the "for" Code Snippet creates an empty for loop, as in:

for (int i = 0; i < length; i++)
{
}

And the "propfull" Code Snippet creates a full property, as in:

private int myVar;
public int MyProperty
{
   get { return myVar; }
   set { myVar = value; }
}

How to use Code Snippets?

To use Code Snippets through keyboard shortcut

  1. In the Visual Studio IDE, open the file that you intend to edit.
  2. In the Code Editor, place the cursor where you would like to insert the Code Snippet.
  3. Type CTRL+K, CTRL+X.
  4. Select the Code Snippet from the Code Snippet inserter and then press "Tab" or "Enter".

Alternatively, you can type the name of the Code Snippet, and then press "Tab" or "Enter".

To use Code Snippets through IntelliSense auto-completion

  1. In the Visual Studio IDE, open the file that you intend to edit.
  2. In the Code Editor, place the cursor where you would like to insert the Code Snippet.
  3. Type the shortcut for the Code Snippet that you want to add to your code.
  4. Type Tab, Tab to invoke the Code Snippet.

What are the benefits?

  1. Coding quickly
  2. No tension of remembering syntax.
  3. An easy approach to follow design/coding standards
  4. And the best thing is, we can define our own Code Snippets and ask the team to follow our project specific coding standards.

What is iterIndex?

It creates a "named" iterator and indexer pair by using a nested class. It creates a sub class to support iteration, and also provides an indexer.

Let's create a class Student

public class Student
{
   public String Name;
   public int Age;
}

And now we need a class Students, that will be a collection of Student objects. So let's define our Students Class:

class Students
{
    Student[] students = new Student[100];
    int idx = -1, Tot = -1;
   
//iterIndex will come here
    public void Add(Student std)
    {
        students[++Tot] = std;
    } 
    public void Add(String name, int age)
    {
        students[++Tot] = new Student()
        {
            Name = name,
            Age = age
        };
    }
}

Now place the cursor below the commented code //iterIndex will come here. And type iterindex and press Tab, Tab.

Wow!, we got predefined code generated by the IDE, here is the sample:

class Students
{
    Student[] students = new Student[100];
    int idx = -1, Tot = -1;
   
//iterIndex will come here 
    public MyViewIterator MyView
    {
        get { return new MyViewIterator(this); }
    } 
    public class
MyViewIterator
    {
        readonly Students outer; 
        internal MyViewIterator(Students outer)
        {
            this.outer = outer;
        } 
       
// TODO: provide an appropriate implementation here
        public int Length { get { return 1; } } 
        public ElementType this[int index]
        {
           
get
            {
               
//
                // TODO: implement indexer here
                //
                // you have full access to Students privates
                //
                throw new NotImplementedException();
                return default(ElementType);
            }
        } 
        public System.Collections.Generic.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < this.Length; i++)
            {
                yield return this[i];
            }
        }
    }
    public void Add(Student std)
    {
        students[++Tot] = std;
    } 
    public void Add(String name, int age)
    {
        students[++Tot] = new Student()
        {
            Name = name,
            Age = age
        };
    }
}

Points to Notice

  • MyViewIterator Class

    Sinces it is a sub class, it will have full access to all it members, i.e private members too.
     
  • MyViewIterator Constructor

    It accepts a Students Object, and assigns it to the outer property.
     
  • Indexer inside MyViewIterator

    It also provides an indexer to access a collection item through the index.
     
  • The GetEnumerator method

    We have implemented neither IEnumerator nor IEnumerable, this will help us to iterate through the collection of Students.
     
  • And MyView property inside Students class

    It returns a new object of MyViewIterator class.

Now let's change the snippet code as in the following

public class Students
{
    Student[] students = new Student[100];
    private int Tot = 0;
    public void Add(Student std)
    {
        students[Tot++] = std;
    } 
    public void Add(String name, int age)
    {
        students[Tot++] = new Student()
        {
            Name = name,
            Age = age
        };
    }
    public MyViewIterator MyView
    {
        get { return new MyViewIterator(this); }
    } 
    public class
MyViewIterator
    {
        readonly Students outer; 
        internal MyViewIterator(Students outer)
        {
            this.outer = outer;
        } 
       
// TODO: provide an appropriate implementation here
        public int Length { get { return outer.Tot; } } 
        public Student this[int index]
        {
            get { return outer.students[index]; }
        } 
        public System.Collections.Generic.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < this.Length; i++)
            {
                yield return outer.students[i];
            }
        }
    }
}


Let's add some Students to our Students class

class Program
{
    static void Main()
    {
        Students s = new Students();
        s.Add("Ajay", 27);
        s.Add("Raj", 28);
    }
}

Using MyViewIterator.GetEnumerator to iterate through each Student

Students.MyViewIterator iterator = s.MyView;
{
    using (var student = iterator.GetEnumerator())
    {
        while (student.MoveNext())
        {
            Console.WriteLine(student.Current.Name);
        }
    }
}

Using foreach to iterate through each Student

foreach (Student std in s.MyView)
{
    Console.WriteLine(std.Name);
}

Using Indexer to get the student:

Student StdAjay = s.MyView[0];
Console.WriteLine(StdAjay.Name + " " + StdAjay.Age.ToString());

Complete Code block

class Program
{
    static void Main()
    {
        Students s = new Students();
        s.Add("Ajay", 27);
        s.Add("Raj", 28); 
        Students.MyViewIterator iterator = s.MyView;
        { 
            using (var student = iterator.GetEnumerator())
            {
                while (student.MoveNext())
                {
                    Console.WriteLine(student.Current.Name);
                }
            }
        } 
        foreach (Student std in s.MyView)
        {
            Console.WriteLine(std.Name);
        } 
        Student StdAjay = s.MyView[0];
        Console.WriteLine(StdAjay.Name + " " + StdAjay.Age.ToString());
    }
}

So do start using Code Snippets and do coding in a smarter way.

Reference : http://msdn.microsoft.com/en-us/library/z4c5cc9b(v=vs.80).aspx