# list泛型集合
集合是oop中的乙個重要概念,c#中對集合的全面支援更是該語言的精華之一。
為什麼要用泛型集合?
在c# 2.0之前,主要可以通過兩種方式實現集合:
a.使用arraylist
直接將物件放入arraylist,操作直觀,但由於集合中的項是object型別,因此每次使用都必須進行繁瑣的型別轉換。
b.使用自定義集合類
比較常見的做法是從collectionbase抽象類繼承乙個自定義類,通過對ilist物件進行封裝實現強型別集合。這種方式要求為每種集合型別寫乙個相應的自定義類,工作量較大。泛型集合的出現較好的解決了上述問題,只需一行**便能建立指定型別的集合。
什麼是泛型?
泛型是c# 2.0中的新增元素(c++中稱為模板),主要用於解決一系列類似的問題。這種機制允許將類名作為引數傳遞給泛型型別,並生成相應的物件。將泛型(包括類、介面、方法、委託等)看作模板可能更好理解,模板中的變體部分將被作為引數傳進來的類名稱所代替,從而得到乙個新的型別定義。泛型是乙個比較大的話題,在此不作詳細解析,有興趣者可以查閱相關資料。
怎樣建立泛型集合?
主要利用system.collections.generic命名空間下面的list泛型類建立集合,語法如下:
定義person類如下:
可以看到,泛型集合大大簡化了集合的實現**,通過它,可以輕鬆建立指定型別的集合。非但如此,泛型集合還提供了更加強大的功能,下面看看其中的排序及搜尋。
listlistoft = new list();
其中的"t"就是所要使用的型別,既可以是簡單型別,如string、int,也可以是使用者自定義型別。下面看乙個具體例子。
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);
泛型集合的排序
排序基於比較,要排序,首先要比較。比如有兩個數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物件,用於比較兩個同型別物件。
下面用新定義的這個比較器對集合進行排序:
還可以通過委託來進行集合排序,首先要定義乙個供委託呼叫的方法,用於存放比較規則,可以用靜態方法。請看下面的**:然後通過內建的泛型委託system.comparison對集合進行排序:
可以看到,後兩種方式都可以對集合按照指定規則進行排序,但筆者更偏向於使用委託方式,可以考慮把各種比較規則放在乙個類中,然後進行靈活呼叫。
//按照姓名對集合進行排序
persons.sort(namecomparer.default);
//輸出所有人姓名
foreach (person p in persons)
class personcomparison
}方法的引數為要進行比較的兩個同型別物件,返回值為int型別,返回值處理規則與compareto方法相同。
system.comparisonnamecomparison = new system.comparison(personcomparison.name);
persons.sort(namecomparison);
//輸出所有人姓名
foreach (person p in persons)
可以看到,後兩種方式都可以對集合按照指定規則進行排序,但筆者更偏向於使用委託方式,可以考慮把各種比較規則放在乙個類中,然後進行靈活呼叫。
泛型集合的搜尋
搜尋就是從集合中找出滿足特定條件的項,可以定義多個搜尋條件,並根據需要進行呼叫。首先,定義搜尋條件,如下所示:
class personpredicate
}上面的搜尋條件放在乙個靜態方法中,方法的返回型別為布林型,集合中滿足特定條件的項返回true,否則返回false。
system.predicatemidagepredicate = new system.predicate(personpredicate.midage);
listmidagepersons = persons.findall(midagepredicate);
//輸出所有的中年人姓名
foreach (person p in midagepersons)
然後通過內建的泛型委託system.predicate對集合進行搜尋:
泛型集合的擴充套件
如果要得到集合中所有人的姓名,中間以逗號隔開,那該怎麼處理?
考慮到單個類可以提供的功能是有限的,很自然會想到對list類進行擴充套件,泛型類也是類,因此可以通過繼承來進行擴充套件。請看下面的**:
//定義persons集合類
class persons : list
return val.substring(0, val.length - 1);}}
//建立並填充persons集合
persons personcol = new persons();
personcol.add(p1);
personcol.add(p2);
personcol.add(p3);
//輸出所有人姓名
console.write(personcol.getallnames()); //輸出「張三,李四,王五」
list的方法和屬性 方法或屬性 作用
capacity 用於獲取或設定list可容納元素的數量。當數量超過容量時,這個值會自動增長。您可以設定這個值以減少容量,也可以呼叫trin()方法來減少容量以適合實際的元素數目。
count 屬性,用於獲取陣列中當前元素數量
item( ) 通過指定索引獲取或設定元素。對於list類來說,它是乙個索引器。
add( ) 在list中新增乙個物件的公有方法
addrange( ) 公有方法,在list尾部新增實現了icollection介面的多個元素
binarysearch( ) 過載的公有方法,用於在排序的list內使用二分查詢來定位指定元素.
clear( ) 在list內移除所有元素
contains( ) 測試乙個元素是否在list內
copyto( ) 過載的公有方法,把乙個list拷貝到一維陣列內
exists( ) 測試乙個元素是否在list內
find( ) 查詢並返回list內的出現的第乙個匹配元素
findall( ) 查詢並返回list內的所有匹配元素
getenumerator( ) 過載的公有方法,返回乙個用於迭代list的列舉器
getrange( ) 拷貝指定範圍的元素到新的list內
indexof( ) 過載的公有方法,查詢並返回每乙個匹配元素的索引
insert( ) 在list內插入乙個元素
insertrange( ) 在list內插入一組元素
lastindexof( ) 過載的公有方法,,查詢並返回最後乙個匹配元素的索引
remove( ) 移除與指定元素匹配的第乙個元素
removeat( ) 移除指定索引的元素
removerange( ) 移除指定範圍的元素
reverse( ) 反轉list內元素的順序
sort( ) 對list內的元素進行排序
toarray( ) 把list內的元素拷貝到乙個新的陣列內
trimtosize( ) 將容量設定為list中元素的實際數目
小結:
VC 列表控制項 CList 使用方法
列表控制項可以看作是功能增強的listbox,它提供了四種風格,而且可以同時顯示一列的多中屬性值。mfc中使用clistctrl類來封裝列表控制項的各種操作。通過呼叫bool create dword dwstyle,const rect rect,cwnd pparentwnd,uint nid ...
C List 方法的使用
class collection private void initlist public void listtest console.writeline n 根據id分組 var query list.groupby pet pet.id ienumerable query list.groupb...
C List常用方法
訪問 1.list index 下標index從0開始 增加 1.list.add t t t為儲存型別,將資料 t 存入鍊錶末尾 2.list.addrange ienumerablecollection ienumerable代表此型別的陣列型別 不一定是陣列,鍊錶之類的都行,只要實現了 ien...