|
|
|
|
|
|
今天從網(wǎng)上復制過來一段代碼,結(jié)果下面這行代碼報錯了:
var list = new List();
報錯提示為:
使用泛型類型“System.Collections.Generic.List<T>”需要1個類型參數(shù)
之后我把這行代碼改為如下這樣:
List<String> list = new List<String>();
編譯成功,并且執(zhí)行結(jié)果完全正確。
為什么要這樣改寫代碼?這就需要我們了解一下C#泛型類之List<T>。
C#泛型類 List<T> 的定義
System.Collections.Generic.List<T> 類表示可通過索引訪問的對象的強類型列表。提供用于對列表進行搜索、排序和操作的方法。T為類型參數(shù),代表列表中元素的類型。該類實現(xiàn)了IList<T>泛型接口,是ArrayList類的泛型等效類,其大小可按需動態(tài)增加。
List<T> 轉(zhuǎn)換 t 列表為對象
在 C# 中,可以使用 System.Collections.Generic.List<T> 類型來創(chuàng)建一個具有強類型元素的列表。如果你有一個 t 列表,你可以通過將其傳遞給 List<T> 的構(gòu)造函數(shù)來將其轉(zhuǎn)換為 List<T> 類型。
例如,如果 t 列表包含整數(shù)類型的元素,你可以使用以下代碼將其轉(zhuǎn)換為 List<int> 類型:
List<int> c = new List<int>(t);
此代碼將創(chuàng)建一個名為 c 的新列表,其中包含 t 列表中的所有整數(shù)元素。如果你的 t 列表包含其他類型的元素,只需將 int 替換為相應的類型即可,比如,如果 t 列表包含字符串類型的元素,你可以使用以下代碼將其轉(zhuǎn)換為 List<String> 類型:
List<String> list = new List<String>();
這正是本文開頭報錯代碼的正確寫法。
需要注意的是,這個操作可能會耗費一些時間和內(nèi)存,具體取決于 t 列表的大小。如果你的 t 列表非常大,而且你只需要遍歷其元素,那么你可能會希望僅使用 IEnumerable<T> 接口或使用 foreach 循環(huán)進行遍歷,而不需要將其轉(zhuǎn)換為 List<T> 類型。
List<T> 構(gòu)造函數(shù)
| 名稱 | 說明 |
|---|---|
| List<T>() | 初始化 List<T> 類的新實例,該實例為空并且具有默認初始容量(0)。 |
| List<T>(IEnumerable<T>) | 初始化 List<T> 類的新實例,該實例包含從指定集合復制的元素并且具有足夠的容量來容納所復制的元素。 |
| List<T>(Int32) | 始化 List<T> 類的新實例,該實例為空并且具有指定的初始容量。 |
1、 List<T> 類既使用相等比較器又使用排序比較器。
諸如 Contains、IndexOf、LastIndexOf 和 Remove 這樣的方法對列表元素使用相等比較器。類型 T 的默認相等比較器按如下方式確定。如果類型 T 實現(xiàn) IEquatable<T> 泛型接口,則相等比較器為該接口的 Equals(T) 方法;否則,默認相等比較器為 Object.Equals(Object)。
諸如 BinarySearch 和 Sort 這樣的方法對列表元素使用排序比較器。類型 T 的默認比較器按如下方式確定。如果類型 T 實現(xiàn) IComparable<T> 泛型接口,則默認比較器為該接口的 CompareTo(T) 方法;否則,如果類型 T 實現(xiàn)非泛型 IComparable 接口,則默認比較器為該接口的 CompareTo(Object) 方法。如果類型 T 沒有實現(xiàn)其中任一個接口,則不存在默認比較器,并且必須顯式提供比較器或比較委托。
2、 List<T> 不保證是排序的。在執(zhí)行要求 List<T> 已排序的操作(例如 BinarySearch)之前,你必須對 List<T> 進行排序。
3、 List<T> 不保證是排序的。在執(zhí)行要求 List<T> 已排序的操作(例如 BinarySearch)之前,你必須對 List<T> 進行排序。
4、 使用整數(shù)索引可以訪問此集合中的元素。此集合中的索引從零開始。
5、 List<T> 接受 null 作為引用類型的有效值并且允許有重復的元素。
6、 大多數(shù)情況下List<T>執(zhí)行得更好并且是類型安全的,可以替換ArrayList,但是如果對類型 T 使用值類型,則編譯器將特別針對該值類型生成 List<T> 類的實現(xiàn)。這意味著不必對 List<T> 對象的列表元素進行裝箱就可以使用該元素,并且在創(chuàng)建大約 500 個列表元素之后,不對列表元素裝箱所節(jié)省的內(nèi)存將大于生成該類實現(xiàn)所使用的內(nèi)存。如果創(chuàng)建小于500個元素,建議使用ArrayList。
相關(guān)文章
