泛型集合List 的詳細用法
名稱空間: System.Collections.Generic
List<T>類是 ArrayList 類的泛型等效類。
該類使用大小可 按需動態增加 的陣列實現 IList<T> 泛型介面。
Enumerable 列舉
Collection 集合
泛型的好處:
它為使用c#語言編寫面向物件程式增加了極大的效力和靈活性。
不會強行對值型別進行裝箱和拆箱,或對引用型別進行向下強制型別轉換,效能得到提高。
注意事項:
在決定使用IList<T> 還是使用ArrayList類(兩者具有類似的功能)時,
記住IList<T> 類在大多數情況下執行得更好並且是型別安全的。
如果對IList<T> 類的型別 T 使用引用型別,則兩個類的行為是完全相同的。
但是,如果對型別 T 使用值型別,則需要考慮實現和裝箱問題。
List的基礎、常用方法
宣告:
List<T> NAME = new List<T>();
List<T> NAME =new List<T> (IEnumerable<T> collection); ----以一個集合作為引數建立List
-
string[] temArr = { "Ha", "Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" };
-
List<string> testList = new List<string>(temArr);
新增元素:
List. Add(T item); ----新增一個元素
List. AddRange(IEnumerable<T> collection); ----新增一組元素
Insert(int index, T item); ----在index位置新增一個元素
遍歷List中元素:
foreach (T element in mList); ----T的型別與mList宣告時一樣
刪除元素:
List. Remove(T item); ----刪除一個值
List. RemoveAt(int index); ----刪除下標為index的元素
List. RemoveRange(int index, int count); ----從下標index開始,刪除count個元素
注:刪除某元素後,其後面的元素下標自動跟進
判斷某個元素是否在該List中:
List. Contains(T item); ----返回true或false,很實用
-
if (mList.Contains("Hunter")) { Console.WriteLine("There is Hunter in the list"); }
-
else { mList.Add("Hunter");
-
Console.WriteLine("Add Hunter successfully."); }
給List裡面元素順序反轉: List. Reverse () 可以與List. Sort ()配合使用,達到想要的效果
List清空:
List.Clear ();
mList.Clear();
獲得List中元素數目:
List.Count (); ----返回int值
List的進階、強大方法
List.Find 方法:返回 T
搜尋與指定謂詞所定義的條件相匹配的元素,並返回整個 List 中的第一個匹配元素
public T Find(Predicate<T> match);
Predicate是對方法的委託,如果傳遞給它的物件與委託中定義的條件匹配,則該方法返回 true。
當前 List 的元素被逐個傳遞給Predicate委託,並在 List 中向前移動,從第一個元素開始,到最後一個元素結束。
當找到匹配項時處理即停止。
Predicate 可以委託給一個函式或者一個拉姆達表示式
委託給拉姆達表示式:
-
string listFind = mList.Find( name => { if (name.Length > 3) { return true; } return false; } );
-
Console.WriteLine(listFind);
-
//name是變數,代表的是mList 中元素,自己設定
-
//輸出是Hunter
委託給一個函式:
-
string listFind = mList.Find( ListFind );
-
Console.WriteLine(listFind);
-
public bool ListFind(string name)
-
{ if (name.Length > 3) { return true; } return false; }
List.FindLast 方法:返回 T
public T FindLast(Predicate<T> match);
搜尋與指定謂詞所定義的條件相匹配的元素,並返回整個 List 中的最後一個匹配元素。用法與List.Find相同。
List.TrueForAll方法:返回 bool
public bool TrueForAll(Predicate<T> match);
確定是否 List 中的每個元素都與指定的謂詞所定義的條件相匹配
委託給拉姆達表示式:
-
bool flag = mList.TrueForAll(name => { if (name.Length > 3) { return true; } else { return false; } } );
-
Console.WriteLine("True for all: "+flag);
-
//flag值為false
委託給一個函式:
-
bool flag = mList.TrueForAll( ListFind );
-
Console.WriteLine("True for all: "+flag);
-
//flag值為false 這兩種方法的結果是一樣的
List.FindAll方法:返回 List<T>
public List<T> FindAll(Predicate<T> match);
檢索與指定謂詞所定義的條件相匹配的所有元素
-
List<string> subList = mList.FindAll(ListFind); //委託給ListFind函式
-
foreach (string s in subList) { Console.WriteLine("element in subList: "+s); }
-
這時subList儲存的就是所有長度大於3的元素
List.Take(n)方法: 返回List<T>
獲得前n行 返回值為IEnumetable<T>,T的型別與List<T>的型別一樣
-
IEnumerable<string> takeList= mList.Take(5);
-
foreach (string s in takeList) { Console.WriteLine("element in takeList: " + s); }
這時takeList存放的元素就是mList中的前5個
List.Where方法:返回List<T>
檢索與指定謂詞所定義的條件相匹配的所有元素
跟 List.FindAll 方法類似。
-
IEnumerable<string> whereList = mList.Where(name => { if (name.Length > 3) { return true; } else { return false; } });
-
foreach (string s in subList) { Console.WriteLine("element in subList: "+s); }
這時subList儲存的就是所有長度大於3的元素
List.RemoveAll方法:返回移除的數量
public int RemoveAll(Predicate<T> match);
移除與指定的謂詞所定義的條件相匹配的所有元素。
-
mList.RemoveAll( name => { if (name.Length > 3) { return true; } else { return false; } } );
-
foreach (string s in mList) { Console.WriteLine("element in mList: " + s); }
這時mList儲存的就是移除長度大於3之後的元素。
補充:
比如要實現一個int型別的動態二維陣列。
要增加一行就matrix.add(new List<int>());
某行要增加資料就matrix[n].add(i); 但是不建議這麼操作。
-
List<List<int>> matrix = new List<List<int>>();
-
matrix.Add(new List<int>()); matrix[0].Add(1);
-
Console.WriteLine(matrix[0][0]);
-
Console.ReadKey();
List與陣列的相互轉換
1.從string[]轉List<string>
-
string[] str={“1”,”2”};
-
List <string> list=new List<string>(str);
2.從List<string>轉string[]
-
List<String> listS=new List<String>();
-
listS.Add("str");
-
listS.Add("hello");
-
System.String[] str=listS.ToArray();