代码编写及运行环境Visual Studio 2010 .NET v4.0.30319
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateUseInCommonClass
{
/// <summary>
/// 一般通用类的设计都包含一些标准的任务代码,这些代码包含任务如何执行的逻辑,但是有的时候这些任务包含一些
/// 子任务,只有具体使用通用类的对象才知道如何执行这些子任务,比如说:
/// 建立了一个给对象排序的通用类,在使用的时候需要知道具体的排序规则才能顺利完成排序,比如int对象是比较大小,
/// string对象是比较第一个字母,一些复杂对象可能是比较其中的某个属性值完成排序。
/// 这种情况可以通过委托实现,对于子任务使用委托,可以方便通用类的使用者具体执行执行子任务的方式。
/// </summary>
class Program
{
static void Main(string[] args)
{
//定义并初始化不同类型的三个数组
int[] intItems = { 12, 2, 4, 5, 78, 32, 12, 65 };
string[] stringItems = { "test", "best", "active", "card", "book" };
Person[] personItems = { new Person(12, "Mark"), new Person(45, "Mary"), new Person(32, "Oscar"), new Person(80, "Kele"),new Person(12,"Ada") };
#region Int类型的排序
Console.WriteLine("intItems排序前:");
Console.Write(" ");
foreach (int i in intItems)
{
Console.Write(string.Format("{0,-4}", i));
}
Console.WriteLine();
//给intItems排序
CommonClass.Sort<int>(intItems, (item1, item2) =>
{
if (item1 > item2)
return true;
else
return false;
});
Console.WriteLine("intItems按Int值从小到大排序后:");
Console.Write(" ");
foreach (int i in intItems)
{
Console.Write(string.Format("{0,-4}", i));
}
Console.WriteLine();
#endregion
#region String类型的排序
Console.WriteLine("stringItems排序前:");
Console.Write(" ");
foreach (string str in stringItems)
{
Console.Write(string.Format("{0,-10}", str));
}
Console.WriteLine();
//给stringItems排序
CommonClass.Sort<string>(stringItems, (item1, item2) =>
{
if (item1.CompareTo(item2) > 0)
return true;
else
return false;
});
Console.WriteLine("stringItems按string首字母排序后:");
Console.Write(" ");
foreach (string str in stringItems)
{
Console.Write(string.Format("{0,-10}",str));
}
Console.WriteLine();
#endregion
#region Person类型的排序
Console.WriteLine("personItems排序前:");
foreach (Person per in personItems)
{
Console.WriteLine(string.Format(" Person: Name-{0,-10}Age-{1}",per.Name,per.Age));
}
CommonClass.Sort<Person>(personItems, (item1, item2) =>
{
if (item1.Age > item2.Age)
return true;
else
return false;
});
Console.WriteLine("personItems按年龄从小到大排序后:");
foreach (Person per in personItems)
{
Console.WriteLine(string.Format(" Person: Name-{0,-10}Age-{1}", per.Name, per.Age));
}
CommonClass.Sort<Person>(personItems, (item1, item2) =>
{
if (item1.Name.CompareTo(item2.Name)>0)
return true;
else
return false;
});
Console.WriteLine("personItems按姓名首字母排序后:");
foreach (Person per in personItems)
{
Console.WriteLine(string.Format(" Person: Name-{0,-10}Age-{1}", per.Name, per.Age));
}
#endregion
}
//定义Person类
class Person
{
private int _Age;
private string _Name;
public int Age
{
get
{
return _Age;
}
set
{
_Age = value;
}
}
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
public Person(int age, string name)
{
_Age = age;
_Name = name;
}
}
}
#region 比较通用类设计
/// <summary>
/// 此处使用排序来说明委托在通用类中的使用,此方法在多本C#说中都有介绍,包括:
/// 《C#本质论》
/// 《C#高级编程》
/// </summary>
class CommonClass
{
//定义用于比较两个对象并返回bool类型的委托类型
public delegate bool Compare<T>(T item1, T item2);
//通用排序方法,可以用于比较任何对象,具体比较结果依赖于子任务Compare<T>类型的compare
public static void Sort<T>(T[] items, Compare<T> compare)
{
for (int i = 0; i < items.Count()-1; i++)
{
for (int j = i; j < items.Count(); j++)
{
if (compare(items[i], items[j]))
{
T temp = items[i];
items[i] = items[j];
items[j] = temp;
}
}
}
}
}
#endregion
}
运行结果: