c# ArrayList的應用辦法小總結。本站提示廣大學習愛好者:(c# ArrayList的應用辦法小總結)文章只能為提供參考,不一定能成為您想要的結果。以下是c# ArrayList的應用辦法小總結正文
***
Source URL: http://i.yesky.com/bbs/jsp/view.jsp?articleID=889992&forumID=150
***
1、甚麼是ArrayList
ArrayList就是傳說中的靜態數組,用MSDN中的說法,就是Array的龐雜版本,它供給了以下一些利益:
靜態的增長和削減元素
完成了ICollection和IList接口
靈巧的設置數組的年夜小
2、若何應用ArrayList
上面給年夜家顯示一個最簡略的例子:
ArrayList List = new ArrayList(); for( int i=0;i<10;i++ ) //給數組增長10個Int元素 List.Add(i); //..法式做一些處置 List.RemoveAt(5);//將第6個元素移除 for( int i=0;i<3;i++ ) //再增長3個元素 List.Add(i+20); Int32[] values = (Int32[])List.ToArray(typeof(Int32));//前往ArrayList包括的數組
這是一個簡略的例子,固然沒有包括ArrayList一切的辦法,然則可以反應出ArrayList最經常使用的用法
3、ArrayList主要的辦法和屬性
(1)結構器
ArrayList供給了三個結構器:
public ArrayList();
默許的結構器,將會以默許(16)的年夜小來初始化外部的數組
public ArrayList(ICollection);
用一個ICollection對象來結構,並將該聚集的元素添加到ArrayList
public ArrayList(int);
用指定的年夜小來初始化外部的數組
(2)IsSynchronized屬性和ArrayList.Synchronized辦法
IsSynchronized屬性指導以後的ArrayList實例能否支撐線程同步,而ArrayList.Synchronized靜態辦法則會前往一個ArrayList的線程同步的封裝。
假如應用非線程同步的實例,那末在多線程拜訪的時刻,須要本身手動挪用lock來堅持線程同步,例如:
ArrayList list = new ArrayList(); //... lock( list.SyncRoot ) //當ArrayList為非線程包裝的時刻,SyncRoot屬性其實就是它本身,然則為了知足ICollection的SyncRoot界說,這裡照樣應用SyncRoot來堅持源代碼的標准性 { list.Add( “Add a Item” ); }
假如應用ArrayList.Synchronized辦法前往的實例,那末就不消斟酌線程同步的成績,這個實例自己就是線程平安的,現實上ArrayList外部完成了一個包管線程同步的外部類,ArrayList.Synchronized前往的就是這個類的實例,它外面的每一個屬性都是用了lock症結字來包管線程同步。
****
然則,應用這個辦法(ArrayList.Synchronized)其實不能包管列舉的同步,例如,一個線程正在刪除或添加聚集項,而另外一個線程同時停止列舉,這時候列舉將會拋出異常。所以,在列舉的時刻,你必需明白應用 SyncRoot 鎖定這個聚集。
Hashtable與ArrayList關於線程平安性的應用辦法相似。
****
(3)Count屬性和Capacity屬性
Count屬性是今朝ArrayList包括的元素的數目,這個屬性是只讀的。
Capacity屬性是今朝ArrayList可以或許包括的最年夜數目,可以手動的設置這個屬性,然則當設置為小於Count值的時刻會激發一個異常。
(4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange
這幾個辦法比擬相似
Add辦法用於添加一個元素到以後列表的末尾
AddRange辦法用於添加一批元素到以後列表的末尾
Remove辦法用於刪除一個元素,經由過程元素自己的援用來刪除
RemoveAt辦法用於刪除一個元素,經由過程索引值來刪除
RemoveRange用於刪除一批元素,經由過程指定開端的索引和刪除的數目來刪除
Insert用於添加一個元素到指定地位,列表前面的元素順次往後挪動
InsertRange用於從指定地位開端添加一批元素,列表前面的元素順次往後挪動
別的,還有幾個相似的辦法:
Clear辦法用於消除現有一切的元素
Contains辦法用來查找某個對象在不在列表當中
其他的我就紛歧一包袱了,年夜家可以檢查MSDN,下面講的更細心
(5)TrimSize辦法
這個辦法用於將ArrayList固定到現實元素的年夜小,當靜態數組元素肯定不在添加的時刻,可以挪用這個辦法來釋放空余的內存。
(6)ToArray辦法
這個辦法把ArrayList的元素Copy到一個新的數組中。
4、ArrayList與數組轉換
例1:
ArrayList List = new ArrayList(); List.Add(1); List.Add(2); List.Add(3); Int32[] values = (Int32[])List.ToArray(typeof(Int32));
例2:
ArrayList List = new ArrayList(); List.Add(1); List.Add(2); List.Add(3); Int32[] values = new Int32[List.Count]; List.CopyTo(values);
下面引見了兩種從ArrayList轉換到數組的辦法
例3:
ArrayList List = new ArrayList(); List.Add( “string” ); List.Add( 1 ); //往數組中添加分歧類型的元素 object[] values = List.ToArray(typeof(object)); //准確 string[] values = (string[])List.ToArray(typeof(string)); //毛病
和數組紛歧樣,由於可以轉換為Object數組,所以往ArrayList外面添加分歧類型的元素是不會失足的,然則當挪用ArrayList辦法的時刻,要末傳遞一切元素都可以准確轉型的類型或許Object類型,不然將會拋出沒法轉型的異常。
5、ArrayList最好應用建議
這一節我們來評論辯論ArrayList與數組的差異,和ArrayList的效力成績
(1)ArrayList是Array的龐雜版本
ArrayList外部封裝了一個Object類型的數組,從普通的意義來講,它和數組沒有實質的差異,乃至於ArrayList的很多辦法,如Index、IndexOf、Contains、Sort等都是在外部數組的基本上直接挪用Array的對應辦法。
(2)外部的Object類型的影響
關於普通的援用類型來講,這部門的影響不是很年夜,然則關於值類型來講,往ArrayList外面添加和修正元素,都邑惹起裝箱和拆箱的操作,頻仍的操作能夠會影響一部門效力。
然則恰好關於年夜多半人,多半的運用都是應用值類型的數組。
清除這個影響是沒有方法的,除非你不消它,不然就要承當一部門的效力喪失,不外這部門的喪失不會很年夜。
(3)數組擴容
這是對ArrayList效力影響比擬年夜的一個身分。
每當履行Add、AddRange、Insert、InsertRange等添加元素的辦法,都邑檢討外部數組的容量能否不敷了,假如是,它就會以以後容量的兩倍來從新構建一個數組,將舊元素Copy到新數組中,然後拋棄舊數組,在這個臨界點的擴容操作,應當來講是比擬影響效力的。
例1:好比,一個能夠有200個元素的數據靜態添加到一個以默許16個元素年夜小創立的ArrayList中,將會經由:
16*2*2*2*2 = 256
四次的擴容才會知足終究的請求,那末假如一開端就以:
ArrayList List = new ArrayList( 210 );
的方法創立ArrayList,不只會削減4次數組創立和Copy的操作,還會削減內存應用。
例2:估計有30個元素而創立了一個ArrayList:
ArrayList List = new ArrayList(30);
在履行進程中,參加了31個元素,那末數組會擴大到60個元素的年夜小,而這時候候不會有新的元素再增長出去,並且有無挪用TrimSize辦法,那末就有1次擴容的操作,而且糟蹋了29個元素年夜小的空間。假如這時候候,用:
ArrayList List = new ArrayList(40);
那末一切都處理了。
所以說,准確的預估能夠的元素,而且在恰當的時刻挪用TrimSize辦法是進步ArrayList應用效力的主要門路。
(4)頻仍的挪用IndexOf、Contains等辦法(Sort、BinarySearch等辦法經由優化,不在此列)惹起的效力喪失
起首,我們要明白一點,ArrayList是靜態數組,它不包含經由過程Key或許Value疾速拜訪的算法,所以現實上挪用IndexOf、Contains等辦法是履行的簡略的輪回來查找元素,所以頻仍的挪用此類辦法其實不比你本身寫輪回而且稍作優化來的快,假如有這方面的請求,建議應用Hashtable或SortedList等鍵值對的聚集。
ArrayList al=new ArrayList(); al.Add("How"); al.Add("are"); al.Add("you!"); al.Add(100); al.Add(200); al.Add(300); al.Add(1.2); al.Add(22.8);
.........
//第一種遍歷 ArrayList 對象的辦法 foreach(object o in al) { Console.Write(o.ToString()+" "); } //第二種遍歷 ArrayList 對象的辦法 IEnumerator ie=al.GetEnumerator(); while(ie.MoveNext()) { Console.Write(ie.Curret.ToString()+" "); }
//第三種遍歷 ArrayList 對象的辦法
我忘卻了,好象是 應用 ArrayList對象的一個屬性,它前往一此對象中的元素個數.
然後在應用索引
for(int i=0;i<Count;i++) { Console.Write(al[i].ToString()+" "); }
***
Source URL: http://i.yesky.com/bbs/jsp/view.jsp?articleID=889992&forumID=150