網(wǎng)站建設(shè)營(yíng)銷方案整站外包優(yōu)化公司
列表
數(shù)組可以管理大量數(shù)組,但缺點(diǎn)是無(wú)法更變?nèi)萘俊?br /> 創(chuàng)建小了不夠用,創(chuàng)建大了浪費(fèi)空間。
無(wú)法預(yù)測(cè)需要多少大小的時(shí)候,可能范圍越大,就會(huì)浪費(fèi)越多的空間。
所以,你可能會(huì)想要一種可以擴(kuò)容的東西,代替數(shù)組。
列表就能做到這件事。
創(chuàng)建
泛型列表的構(gòu)造器可以填入一個(gè)數(shù)組,代表初始長(zhǎng)度。
也可以直接傳入一個(gè)可迭代的東西,據(jù)此初始化列表。
也可以什么都不填。
List<int> list1 = new List<int>();
List<int> list2 = new List<int>(10);int[] arr = { 9, 4, 8, 6, 2, 0 };
List<int> list3 = new List<int>(arr);
添加元素
列表使用Add方法添加元素。
在調(diào)用構(gòu)造器時(shí)可以使用對(duì)象初始化器添加元素。
List<int> list2 = new List<int>() { 6, 9, 8 };list2.Add(0);
list2.Add(2);
list2.Add(9);
list2.Add(6);
使用AddRange可以一次添加一堆元素(參數(shù)是一個(gè)可迭代類型)
list2.AddRange(arr);
列表還可以從中間插入元素
list2.Insert(6,-1);//將元素-1插入到索引為6的位置。(原本在6的元素會(huì)被擠到后面去)
list2.InsertRange(2,arr);//將可迭代類型的值插入到索引為2的位置。(原來(lái)在2位置的元素會(huì)被擠到后面去)
刪除元素
List使用Remove,RemoveAt,RemoveAll,RemoveRange方法來(lái)刪除元素
在刪除元素后,后面的內(nèi)容會(huì)向前補(bǔ)齊。
list2.Remove(0);//遍歷元素,直到找到第一個(gè)和這個(gè)元素相等的元素。移除他。如果真的找到并移除了就返回true
list2.RemoveAt(5);//移除指定索引處的元素
list2.RemoveAll(s=>s>5);//移除所有滿足條件的元素
list2.RemoveRange(2,5);//從索引為2的位置開始,連續(xù)移除5個(gè)元素
訪問元素
列表訪問元素和數(shù)組一樣,使用索引器進(jìn)行訪問。
但不能超過(guò)元素?cái)?shù)量
(不是數(shù)組長(zhǎng)度)。
在構(gòu)造器填入的數(shù)字是初始數(shù)組的長(zhǎng)度。
列表的原理其實(shí)是幫你管理并自動(dòng)擴(kuò)容一個(gè)數(shù)組。
list2[2] = 16;
int i1 = list2[3];
遍歷
列表使用Count屬性代替數(shù)組的Length驗(yàn)證條件。
for (int i = 0; i < list2.Count; i++)
{Console.WriteLine(list2[i]);
}
只有數(shù)組才有長(zhǎng)度一說(shuō),他創(chuàng)建就是以長(zhǎng)度為準(zhǔn),不可更改,在內(nèi)存中以一個(gè)整塊存在。
這些復(fù)雜數(shù)據(jù)結(jié)構(gòu)只會(huì)說(shuō)元素?cái)?shù)量(Count)。因?yàn)樗麄兛赡苁橇闵⒌摹?/p>
設(shè)置容量
列表在沒包含任何元素時(shí),所有同泛型的列表會(huì)共用一個(gè)長(zhǎng)度為0的數(shù)組。
在需要擴(kuò)容的時(shí)候,創(chuàng)建一個(gè)容量翻倍(且至少為4)的數(shù)組。
意味著如果多次擴(kuò)容也會(huì)有很高的性能損失。
所以建議在創(chuàng)建列表時(shí)盡量預(yù)判需要的長(zhǎng)度。
Console.WriteLine(list2.Capacity);//背后數(shù)組的長(zhǎng)度,可以獲取或設(shè)置。但不能設(shè)置小于當(dāng)前元素?cái)?shù)量的值
list2.TrimExcess();//如果元素?cái)?shù)量小于數(shù)組長(zhǎng)度的90%,裁剪數(shù)組使得和元素?cái)?shù)量匹配
list2.Clear();//清空元素。這不會(huì)改變后背數(shù)組的長(zhǎng)度。
方便的方法
List有很多和Linq功能相似的方法,可以直接使用而無(wú)需調(diào)用Linq。
list2.Sort();//list可以直接調(diào)用排序方法,而無(wú)需像數(shù)組一樣使用數(shù)組基類調(diào)用
list2.Sort((a, b) => b - a);//雖然沒有降序方法,但你可以使用委托自定義排序list2.Reverse();//反轉(zhuǎn)整個(gè)列表list2.IndexOf(5);//查找和參數(shù)相同的第一個(gè)元素。并返回他的索引。如果找不到返回-1
list2.FindIndex(s => s > 5);//找到第一個(gè)滿足條件的元素,返回他的所有,如果沒找到返回-1list2.Contains(3);//判斷是否存在這樣的元素
list2.Find(s=>s>5);//找到第一個(gè)滿足條件的元素,并返回
list2.FindAll(s => s > 5);//找到所有滿足條件的元素,構(gòu)成一個(gè)新的List返回list2.Foreach(s => Console.WriteLine(s++));//遍歷所有元素并執(zhí)行一個(gè)委托。
//相較于自己調(diào)用foreach循環(huán),區(qū)別在于臨時(shí)變量是可以修改的(不會(huì)影響原元素)。
//并且委托的return只是用來(lái)結(jié)束委托的。而foreach循環(huán)中return會(huì)結(jié)束當(dāng)前方法。