posted on Tuesday, February 21, 2006 11:44 AM by BayerWhite

Implementing Generic List And IEnumerator

In this example, I show how to iterate through a collection of Employees by using the System.Collections.Generic.List and System Collections.Generic.IEnumerator Namespace. System.Collections.Generic.List is similar to System.Collections.ArrayList which we are used to using, however Generic.List allows you to Type-Safe your objects for better performance compared toexpensive processing/poor performance that comes with boxing and unboxing objects. I also decided to throw in how to build a basic generic delegate to show how it could also advantage of a Type-Safe Sender parameter. Let's go ahead and delv into the code. My comments should help you follow how I used the generics 

public class Employee

{

private string _name;

public string Name

{

get { return _name; }

set { _name = value; }

}

private int _age;

public int Age

{

get { return _age; }

set { _age = value; }

}

private string _sSN;

public string SSN

{

get { return _sSN; }

set { _sSN = value; }

}

private string _employeeNumber;

public string EmployeeNumber

{

get { return _employeeNumber; }

set { _employeeNumber = value; }

}

public Employee(string EmpName, int EmpAge, string EmpSSN)

{

Name = EmpName;

Age = EmpAge;

SSN = EmpSSN;

EmployeeNumber = "Employ" + EmpSSN;

}

}

public delegate void EventHandler<T, U>(T Sender, U eventargs); //EventHandler has two placehoders Sender and eventargs. Notice that the are of NO Type! I also commented out the old way of declaring my delegate and event

public class Employees

{

//OLD...public delegate void EmployeeAdded(object sender, EmployeeArgs e);

//OLD...public event EmployeeAdded Added;

public event EventHandler<Employees,EmployeeArgs> AddedEvent; //Type-Safe because I am declaring it with 'Employee' and 'EmployeeArgs'

List<Employee> _employees = new List<Employee>(); //Type-Safe by declaring it as 'Employee'

public void Add(Employee NewEmployee)

{

_employees.Add(NewEmployee);

//OLD...Added(this,new EmployeeArgs(NewEmployee));

AddedEvent(this, new EmployeeArgs(NewEmployee)); //Fire this event once an employee has been added

}

public IEnumerator<Employee> GetEnumerator() //By declaring the IEnmerator we are able to iterate through each employee

{

foreach (Employee Emp in _employees)

{

yield return Emp;

}

}

}

public class EmployeeArgs:EventArgs //Basic EmployeeArgs that inherits from EventArgs

{

public EmployeeArgs(Employee Emp)

{

EmployeeNumber = Emp.EmployeeNumber;

}

public string _employeeNumber;

public string EmployeeNumber

{

get { return _employeeNumber; }

set { _employeeNumber = value; }

}

}

Now that I have my business logic, I created a windows form to model how it works.

public partial class Form1 : Form

{

Employees MyEmployees = new Employees();

public Form1()

{

InitializeComponent();

//OLD...MyEmployees.Added+=new Employees.EmployeeAdded(MyEmployees_Added);

MyEmployees.AddedEvent+=new EventHandler<Employees,EmployeeArgs>(MyEmployees_AddedEvent);

}

//OLD...private void MyEmployees_Added(object sender, EmployeeArgs e)

//{

// MessageBox.Show(e.EmployeeNumber);

//}

private void MyEmployees_AddedEvent(Employees sender, EmployeeArgs e)

{

MessageBox.Show(e.EmployeeNumber);

}

private void button1_Click(object sender, EventArgs e)

{

MyEmployees.Add(new Employee (txtName.Text, Convert.ToInt32(txtAge.Text), txtSSN.Text));

foreach (Employee Emp in MyEmployees)

{

MessageBox.Show(Emp.Name);

}

}

}

Comments