代碼編寫及運行環境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
}
運行結果: