[C#.NET][VB.NET] 一般 / 泛型 Generic Collection 集合型別介紹

  • 95427
  • 0
  • C#
  • 2021-07-18

[C#.NET][VB.NET] 一般 / 泛型 Generic Collection 字典集合型別介紹

一般型別(點選連結擴充說明)泛型型別
ArrayListList< >
QueueQueue< >
StackStack< >
HashtableDictionary< >
StoredListStoredList< >
ListDictionaryDictionary< >
HybridDictionaryDictionary< >
OrderedDictionaryDictionary< >
SortedDictionaryStoredDictionary< >
NameValueCollectionDictionary< >
DictionaryEntryKeyValPair< >
StringCollectionList<String>
StringDictionaryDictionary<String>
  

表格左邊一般型別,大都已經學習過了,也知道大致上的類別如何使用,右邊則是對應的泛型型別,功能就跟一般型別差不多,使是用法不同罷了。為何需要泛型?假設當你需要撰寫一個功能/類別時,而你沒有辦法得知使用者會使用什麼型態的參數,有可能是string、也有可能是int,假如我們用泛型就不用擔心程式被呼叫時還要考慮傳入的型別,只要專心開發功能即可。

標準的集合,在功能上或執行的效率都有限制,System.Collections 命名空間

Hashtable用於包含10個或更多項目的集合,對小集合沒效率。
SortedList依索引鍵來排序項目。

集合類別結構

DictionaryEntry主要是用來取出字典集合著Key和Value,我們可以利用它來逐一處理集合中的項目。

集合類別介面

IDictionary主要是用索引鍵來存取項目,不能用索引值。
IComparer自訂排序與順序的比較
IEqualityComparer只接受相等比較,自訂排序與順序的比較是由 IComparer 介面來提供

比較集合

CaseInsensitiveComparer比較兩個物件是否相等,忽略字串的大小寫。

特殊的集合,彌補標準字典的限制,System.Collections.Specialized 命名空間

ListDictionary用於包含10個或更少項目的集合,對大集合沒效率。
HybridDictionary會先實作成ListDictionary的小集合,當內部變大時,將會把自己變成Hashtable的大集合。
OrderedDictionarySortedList類別多了一些功能,更為強大。

字串集合,只能使用字串,如果你操作的對象不是物件而是字串,那這個類別絕對是你的首選,因為它可以省下轉型的動作

StringDictionary索引鍵與資料值均採用強式型別宣告為字串,用法跟Hashtable相似
StringCollection用法跟ArrayList相似
NameValueCollectionStringDictionary相似,差別在於NameValueCollection可以單一索引鍵對應多重值。

 

CollectionsUtil建立忽略字串大小寫HashtableSortedList的集合。

 

如何使用泛型型別,以下就以List< >類別來做說明

1.匯入命名空間 System.Collections.Generic

using System.Collections.Generic;

2.引用泛型類別

//引用泛型 List<string> myGen = new List<string>();

3.加入集合

myGen.Add("簡單"); myGen.Add("範例");            

4.輸出

foreach (string i in myGen) {      Console.WriteLine(i); }

泛型並不困難,使用上跟一般型別沒什麼不同,

在C#底下就用<傳入的型別>,例如:List<string> myGen = new List<string>( );

在VB子下就用(Of 傳入的型別),例如:

Dim myGen As New List(Of String),Dim myGen As List(Of String) = New List(Of String)

如何自定泛型類別

泛型類別宣告如同一般類別相似,只是宣告內容方法不一樣

1
1

1.宣告泛型類別

2.宣告泛型方法

//泛型類別宣告

public class myGeneric<T> 
{      
 	//泛型方發宣告      
 	public void myTest(T myValue)      
 	{           
 		System.Type myType = myValue.GetType();           
		Console.WriteLine(myType);      
	} 
}

3.引用泛型類別

myGeneric<int> myCom1 =new myGeneric<int>(); 
myCom1.myTest(1); 
myGeneric<string> myCom2 = new myGeneric<string>(); 
myCom2.myTest("sdf"); 
myGeneric<double> myCom3 = new myGeneric<double>(); 
myCom3.myTest(12.2344);

 

不管引用任何型態,泛型類別都能照單全收,程式的重用性就大大的提昇。

 

1

範例已包含VB與C#

範例下載:泛型.rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo