Friday 4 March 2011

Collection Objects Initializer

Like C# offers a way to initialize objects, In same way, C# offers way to initialize Collections too. A one can initialize collections with set of items added to it.
 
Let me explain it using an email collection application of a console type.
 
1. Lets Create a class for Emails and Enum for Email Type
 
/// <summary>
/// Email information collection class
/// </summary>
public class Emails
{
 
    /// <summary>
    /// Email id
    /// </summary>
    public Guid guid;
 
    /// <summary>
    /// Email type
    /// </summary>
    public EmailType emailType;
    
    /// <summary>
    /// Email name
    /// </summary>
    public string email;
  
    /// <summary>
    /// Initializes instance of an Emails class
    /// </summary>
    /// <param name="guid">Email id</param>
    /// <param name="emailType">Email type</param>
    /// <param name="email">Email name</param>
    public Emails(Guid guid, EmailType emailType, string email)
    {
         this.guid = guid;
         this.emailType = emailType;
         this.email = email;
    }
}
 
2. Creating an Enum of an Email Type that is used in above class to get an EmailType.
 
/// <summary>
/// Email type
/// </summary>
public enum EmailType
{
     /// <summary>
     /// General
     /// </summary>
     General,
    
     /// <summary>
     /// Organization
     /// </summary>
     Organization,
  
     /// <summary>
     /// Collected
     /// </summary>
     Collected
}
 
3. Creating a main method without Collection Initializer.
 
If we wanted to create a list which contain a collection of emails, we need to do something like this with C# 2.0:
 
static void Main(string[] args)
{
     // Creating collection of emails class
     List<Emails> emails = new List<Emails>();
     emails.Add(new Emails(new Guid(), EmailType.Organization,sanjay.patolia@patni.com));
     emails.Add(new Emails(new Guid(), EmailType.Collected, sanjay.patolia@gmail.com));
     emails.Add(new Emails(new Guid(), EmailType.General, sanjay.patolia@yahoo.com));
 
     // Getting data from collections
     emails.ToList().ForEach(n =>
     {
          Console.WriteLine(n.guid);
          Console.WriteLine(n.email);
          Console.WriteLine(n.emailType.ToString());
     });
 
     Console.ReadKey(true);
}
 
4. Creating a main method with Collection Initializer.
 
It will be more simpler when we use Collection Initializer.
 
static void Main(string[] args)
{
     // Creating collection of emails class
     IEnumerable<Emails> emails = new List<Emails>
     {
          new Emails(new Guid(), EmailType.Organization, sanjay.patolia@patni.com),
          new Emails(new Guid(), EmailType.Collected, sanjay.patolia@gmail.com),
          new Emails(new Guid(), EmailType.General, sanjay.patolia@yahoo.com)
     };
 
     // Getting data from collections
     emails.ToList().ForEach(n =>
     {
          Console.WriteLine(n.guid);
          Console.WriteLine(n.email);
          Console.WriteLine(n.emailType.ToString());
     });
 
     Console.ReadKey(true);
}
 
How it made up: 
object initializers are enclosed in "{" and "}" and seperated by commas ",".
 
Rules to be followed by collection intializers:
1. Object to which collection intializer is applied must be of type that implements System.Collections.Generic.ICollection<T>.
2. It invokes a ICollection<T>.Add(T) for each element in order.