List泛型集合總結(一)

2021-05-23 00:23:33 字數 2819 閱讀 6387

為什麼要用泛型集合?

在c# 2.0之前,主要可以通過兩種方式實現集合:

a.使用arraylist

直接將物件放入arraylist,操作直觀,但由於集合中的項是object型別,因此每次使用都必須進行繁瑣的型別轉換。

b.使用自定義集合類

比較常見的做法是從collectionbase抽象類繼承乙個自定義類,通過對ilist物件進行封裝實現強型別集合。這種方式要求為每種集合型別寫乙個相應的自定義類,工作量較大。泛型集合的出現較好的解決了上述問題,只需一行**便能建立指定型別的集合。

什麼是泛型?

泛型是c# 2.0中的新增元素(c++中稱為模板),主要用於解決一系列類似的問題。這種機制允許將類名作為引數傳遞給泛型型別,並生成相應的物件。將泛型(包括類、介面、方法、委託等)看作模板可能更好理解,模板中的變體部分將被作為引數傳進來的類名稱所代替,從而得到乙個新的型別定義。泛型是乙個比較大的話題,在此不作詳細解析,有興趣者可以查閱相關資料。

怎樣建立泛型集合?

主要利用system.collections.generic命名空間下面的list泛型類建立集合,語法如下:

listlistoft = new list();

可以看到,泛型集合大大簡化了集合的實現**,通過它,可以輕鬆建立指定型別的集合。非但如此,泛型集合還提供了更加強大的功能,下面看看其中的排序及搜尋。

其中的"t"就是所要使用的型別,既可以是簡單型別,如string、int,也可以是使用者自定義型別。下面看乙個具體例子。

//使用泛型委託來進行搜尋

person specialperson = persons.find(delegate(person p) );

備註:在list

和array

集合中搜尋元素經常使用該方法,主要技術是

泛型委託

泛型集合的排序

排序基於比較,要排序,首先要比較。

比如有兩個數1、2,要對他們排序,首先就要比較這兩個數,根據比較結果來排序。如果要比較的是物件,情況就要複雜一點,比如對person物件進行比較,則既可以按姓名進行比較,也可以按年齡進行比較,這就需要確定比較規則。乙個物件可以有多個比較規則,但只能有乙個預設規則,預設規則放在定義該物件的類中。預設比較規則在compareto方法中定義,該方法屬於icomparable泛型介面。請看下面的**:

class person :icomparable

}compareto方法的引數為要與之進行比較的另乙個同型別物件,返回值為int型別,如果返回值大於0,表示第乙個物件大於第二個物件,如果返回值小於0,表示第乙個物件小於第二個物件,如果返回0,則兩個物件相等。

定義好預設比較規則後,就可以通過不帶引數的sort方法對集合進行排序,如下所示:

//按照預設規則對集合進行排序

persons.sort();

//輸出所有人姓名

foreach (person p in persons)

實際使用中,經常需要對集合按照多種不同規則進行排序,這就需要定義其他比較規則,可以在compare方法中定義,該方法屬於icomparer泛型介面,請看下面的**:

按照姓名進行排序

class namecomparer : icomparer }

compare方法的引數為要進行比較的兩個同型別物件,返回值為int型別,返回值處理規則與compareto方法相同。其中的comparer.default返回乙個內建的comparer物件,用於比較兩個同型別物件。

下面用新定義的這個比較器對集合進行排序:

//按照姓名對集合進行排序

persons.sort(namecomparer.default);

//輸出所有人姓名

foreach (person p in persons)

還可以通過委託來進行集合排序,首先要定義乙個供委託呼叫的方法,用於存放比較規則,可以用靜態方法。請看下面的**:然後通過內建的泛型委託system.comparison對集合進行排序:

下面為第二種進行按照姓名排序的方式(委託的形式,推薦)

class personcomparison

}方法的引數為要進行比較的兩個同型別物件,返回值為int型別,返回值處理規則與compareto方法相同。

system.comparisonnamecomparison = new system.comparison(personcomparison.name);

persons.sort(namecomparison);

//輸出所有人姓名

foreach (person p in persons)

可以看到,後兩種方式都可以對集合按照指定規則進行排序,但筆者更偏向於使用委託方式,可以考慮把各種比較規則放在乙個類中,然後進行靈活呼叫。

定義person類如下:

class person

//姓名

public string name

}//年齡

public int age}}

//建立person物件

person p1 = new person("張三", 30);

person p2 = new person("李四", 20);

person p3 = new person("王五", 50);

//建立型別為person的物件集合

listpersons = new list();

//將person物件放入集合

persons.add(p1);

persons.add(p2);

persons.add(p3);

//輸出第2個人的姓名

console.write(persons[1].name);

泛型集合List

泛型集合list泛型最重要的應用就是集合操作,使用泛型集合可以提高 重用性,型別安全和更佳的效能。list的用法和arraylist相似,list有更好的型別安全性,無須拆,裝箱。定義乙個list泛型集合的語法如下 list集合名 new list 在泛型定義中,泛型型別引數 是必須指定的,其中t是...

List泛型集合

陣列 定義後長度固定的。泛型集合可以改變。list字串集合,集合中多個字串。與陣列一樣,索引從0開始,對應每乙個字串。方法有。list.add 增加,list.removeat 根據索引刪除。list.insert 0,插入。list.addrange 陣列 list.sort 公升序,list.r...

泛型集合List

泛型是具有佔位符 型別引數 的類 結構 介面和方法,這些佔位符是類 結構 介面和方法所儲存或使用的乙個或多個型別的佔位符。泛型集合類可以將型別引數用作它所儲存的物件的型別的佔位符 型別引數作為其字段的型別和其方法的引數型別出現。泛型方法可以將其型別引數用作其返回值的型別或者其形參的 型別之一。lis...