為什麽要使用泛型集合?
在C# 2.0之前,實現集合主要有兩種方式:
A.使用數組列表
將對象直接放入ArrayList很直觀,但是由於集合中的項都是對象類型,所以每次都要進行繁瑣的類型轉換。
B.使用自定義集合類
常見的做法是從CollectionBase抽象類繼承壹個自定義類,通過封裝IList對象實現壹個強類型集合。這種方法需要為每種集合類型編寫相應的自定義類,這需要大量的工作。泛型集合的出現很好地解決了上述問題,創建指定類型的集合只需要壹行代碼。
什麽是泛型?
Generic是C# 2.0中的新元素(C++中稱為template),主要用於解決壹系列類似的問題。這種機制允許將類名作為參數傳遞給泛型類型和要生成的相應對象。理解泛型(包括類、接口、方法、委托等)可能更好。)作為模板,模板中的變體部分將被作為參數傳入的類名所替換,從而獲得壹個新的類型定義。泛型是壹個很大的話題,這裏就不詳細分析了。有意者可查閱相關資料。
如何創建通用集合?
主要使用系統下的List泛型類。用於創建集合的通用命名空間。語法如下:
List < T > List oft = new List < T >();
“t”是要使用的類型,可以是簡單類型,如string和int,也可以是用戶定義的類型。我們來看壹個具體的例子。
按如下方式定義人員分類:
階級人士
{
私有string _ name//名稱
private int _ age//年齡
//創建壹個人對象
公眾人物(字符串名稱,整數)
{
這個。_ name = Name
這個。_age =年齡;
}
//名稱
公共字符串名稱
{
獲取{ return _ name}
}
//年齡
公共互聯網
{
get { return _ age}
}
}
//創建壹個人對象
Person p1 =新人(“張三”,30);
人p2 =新人(《李四》,20);
人p3 =新人(“王五”,50);
//創建Person類型的對象集合。
List < Person > persons = new List < Person >();
//將Person對象放入集合中。
人。添加(p 1);
人。添加(p2);
人。添加(P3);
//輸出第二個人的名字。
控制臺。寫(persons[1])。姓名);
如您所見,泛型集合極大地簡化了集合的實現代碼,通過它您可以輕松地創建指定類型的集合。此外,泛型集合還提供了更強大的功能。讓我們來看看排序和搜索。
壹般集合的排序
排序是基於比較的。要排序,首先要比較。例如,有兩個數字1和2。要對它們進行排序,首先要對這兩個數字進行比較,根據比較結果進行排序。如果要比較對象,情況會復雜壹點。比如比較Person對象,可以按姓名或年齡進行比較,所以需要確定比較規則。壹個對象可以有多個比較規則,但只能有壹個默認規則。默認規則放在定義對象的類中。默認的比較規則是在CompareTo方法中定義的,該方法屬於icomparable < t >泛型接口。請看下面的代碼:
類別人員:IComparable <人員>
{
//按年齡比較
公共國際比較(人員p)
{
歸還這個。年齡- p .年齡;
}
}
CompareTo方法的參數是另壹個要比較的同類型對象,返回值的類型為int。如果返回值大於0,說明第壹個對象大於第二個對象;如果小於0,說明第壹個對象比第二個對象小;如果為0,則兩個對象相等。
定義默認比較規則後,您可以通過不帶參數的排序方法對集合進行排序,如下所示:
//根據默認規則對集合進行排序。
人。sort();
//輸出所有者的姓名
foreach(人員中的人員p)
{
控制臺。WriteLine(p . Name);//輸出順序是“李四”“張三”“王五”
}
在實際使用中,經常需要根據許多不同的規則對集合進行排序,因此需要定義其他的比較規則,這些規則可以在Compare方法中定義,Compare方法屬於icomparer < t >泛型接口。請看下面的代碼:
類名比較器:IComparer
{
//存儲排序器實例
public static name comparer Default = new name comparer();
//按名稱比較
公共int比較(Person p1,Person p2)
{
返回系統。collections . comparer . default . compare(p 1。名字,p2。姓名);
}
}
Compare方法的參數是兩個相同類型的待比較對象,返回值類型為int,返回值處理規則與CompareTo方法相同。比較器。Default返回內置的Comparer對象,該對象用於比較兩個相同類型的對象。
讓我們用這個新定義的比較器對集合進行排序:
//按名稱對集合進行排序。
人。Sort(NameComparer。默認);
//輸出所有者的姓名
foreach(人員中的人員p)
{
控制臺。WriteLine(p . Name);//輸出順序是“李四”“王五”“張三”
}
您還可以通過委托對集合進行排序。首先,您需要定義壹個方法,供委托調用來存儲比較規則。您可以使用靜態方法。請看下面的代碼:
班級人員比較
{
//按名稱比較
公共靜態int名稱(Person p1,Person p2)
{
返回系統。collections . comparer . default . compare(p 1。名字,p2。姓名);
}
}
方法的參數是兩個要比較的同類型對象,返回值類型為int,返回值處理規則與CompareTo方法相同。然後通過內置的通用委托系統對集合進行排序。比較:
系統。比較<人員>姓名比較=新系統。比較<人物>(人物比較。姓名);
人。排序(name comparison);
//輸出所有者的姓名
foreach(人員中的人員p)
{
控制臺。WriteLine(p . Name);//輸出順序是“李四”“王五”“張三”
}
可以看出,後兩種方法都可以按照指定的規則對集合進行排序,但作者更傾向於使用delegate方法,可以考慮將各種比較規則放在壹個類中,然後靈活調用。
搜索通用集合
搜索是從集合中找到滿足特定條件的項目。您可以定義多個搜索條件,並根據需要調用它們。首先,按如下方式定義搜索標準:
類人稱謂詞
{
//找中年人(40歲以上)
公共靜態布爾MidAge(人p)
{
如果(年齡> = 40歲)
返回true
其他
返回false
}
}
以上搜索條件放在壹個靜態方法中,方法的返回類型為Boolean,集合中滿足特定條件的項返回true,否則返回false。然後通過內置的通用委托系統搜索集合。預測< t >:
系統。謂詞< Person> MidAgePredicate =新系統。謂詞< Person >(Person謂詞。MidAge);
list < Person > midage persons = persons。find all(midage predicate);
//輸出所有中年人的名字。
foreach(中期人員中的人員p)
{
控制臺。WriteLine(p . Name);//輸出“王五”
}
通用集合的擴展
如果我想得到集合中所有人的名字,用逗號分隔,該怎麽做?
考慮到單個類所能提供的功能是有限的,自然要擴展list < t >類。泛型類也是類,所以可以通過繼承來擴展。請看下面的代碼:
//定義Persons集合類
類別人員:列表<人員>
{
//獲取集合中所有人的姓名。
公共字符串GetAllNames()
{
如果(這個。計數== 0)
返回“”;
string val =
foreach(此處的個人p)
{
val += p.Name +",";
}
返回瓦爾。子串(0,val。長度-1);
}
}
//創建並填充Persons集合
Persons PersonCol = new Persons();
PersonCol。添加(p 1);
PersonCol。添加(p2);
PersonCol。添加(P3);
//輸出所有者的姓名
控制臺。寫(PersonCol。GetAllNames());//輸出“張三,李四,王五”
總結:
本文重點介紹了在C# 2.0中應用泛型實現集合,以及對集合函數的擴展。適當使用泛型集合可以減少大量重復工作,大大提高開發效率。事實上,集合只是泛型的壹個典型應用。如果想進壹步了解仿制藥,可以查閱其他相關資料。希望這篇文章對妳有用:-)