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);
}
}
}