原来集合里面的对象也能按照某种规则进行排序,只要简单实现IComparer接口;数组的排序也是如此,需要注意的是,集合或数组已有默认的排序方式,数字时默认从小到大,文字时默认按字母顺序。下面是示例:
如果按照指定的规则排序,先制定排序规则(实现IComparer接口):
namespace 对象排序
{
class Employee
{
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
}
class EmployeeSortAdapter : IComparer<Employee>
{
#region IComparer<Employee> 成员
public int Compare(Employee emp1, Employee emp2)
{
Employee e1 = emp1;
Employee e2 = emp2;
if (e1.Age == e2.Age)
{
return 0;
}
else if (e1.Age > e2.Age)
{
return 1;
}
else if (e1.Age < e2.Age)
{
return -1;
}
return default(int);
}
#endregion
}
class EmployeeSortAdapter1 : IComparer
{
#region IComparer<Employee> 成员
public int Compare(object emp1, object emp2)
{
Employee e1 = (Employee)emp1;
Employee e2 = (Employee)emp2;
if (e1.Age == e2.Age)
{
return 0;
}
else if (e1.Age > e2.Age)
{
return 1;
}
else if (e1.Age < e2.Age)
{
return -1;
}
return default(int);
}
#endregion
}
class NumberSortASCAdapter : IComparer
{
#region IComparer<Employee> 成员
public int Compare(object emp1, object emp2)
{
if (Convert.ToInt32(emp1) == Convert.ToInt32(emp2))
return 0;
else if (Convert.ToInt32(emp1) > Convert.ToInt32(emp2))
return -1;
else if (Convert.ToInt32(emp1) < Convert.ToInt32(emp2))
return 1;
return default(int);
}
#endregion
}
}
调用排序规则的集合方法
try
{
Employee[] employees = new Employee[6];
for (int i = 0; i < 6; i++)
{
employees[i] = new Employee();
}
int[] intTest = new int[100];
Random ro = new Random(0);
//for (int i = 0; i < 100; i++)
//{
// intTest[i] = ro.Next(0, 99);
//}
StringBuilder sb = new StringBuilder();
//foreach (int i in intTest)
//{
// sb.AppendLine(Convert.ToString(i));
//}
Hashtable hashtable = new Hashtable();
Random rm = new Random();
int RmNum = 100;
for (int i = 0; hashtable.Count < RmNum; i++)
{
int nValue = rm.Next(0, 100);
if (!hashtable.ContainsValue(nValue))
{
hashtable.Add(nValue, nValue);
intTest[hashtable.Count-1] = nValue;
sb.Append(Convert.ToString(nValue) + "|");
}
}
sb.Append("数量:" + Convert.ToString(hashtable.Count));
textBox1.Text = sb.ToString();
sb = new StringBuilder();
Array.Sort(intTest,new NumberSortASCAdapter());
foreach (int item in intTest)
{
sb.Append(Convert.ToString(item) + "|");
}
sb.Append("数量:" + Convert.ToString(hashtable.Count));
textBox2.Text = sb.ToString();
employees[0].Age = 12;
employees[1].Age = 34;
employees[2].Age = 64;
employees[3].Age = 53;
employees[4].Age = 2;
employees[5].Age = 1;
ArrayList al = new ArrayList();
al.Add(employees[0]);
al.Add(employees[1]);
al.Add(employees[2]);
al.Add(employees[3]);
al.Add(employees[4]);
al.Add(employees[5]);
al.Sort(new EmployeeSortAdapter1());
//Array.Sort(employees, new EmployeeSortAdapter());
Array.Sort(employees, new EmployeeSortAdapter1());
//foreach (Employee emp in employees)
//{
// sb.AppendLine(Convert.ToString(emp.Age));
//}
//foreach (Employee emp in al)
//{
// sb.AppendLine(Convert.ToString(emp.Age));
//}
Console.Read();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.StackTrace);
}
}