當前位置:成語大全網 - 書法字典 - C#設置泛型

C#設置泛型

集合是OOP中的壹個重要概念,C#對集合的全面支持是該語言的精髓之壹。

為什麽要使用泛型集合?

在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中應用泛型實現集合,以及對集合函數的擴展。適當使用泛型集合可以減少大量重復工作,大大提高開發效率。事實上,集合只是泛型的壹個典型應用。如果想進壹步了解仿制藥,可以查閱其他相關資料。希望這篇文章對妳有用:-)