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