軟件開發過程中,不可避免會用到集合,C#中的集合表現為數組和若干集合類。不管是數組還是集合類,它們都有各自的優缺點。如何使用好集合是我們在開發過程中必須掌握的技巧。不要小看這些技巧,一旦在開發中使用了錯誤的集合或針對集合的方法,應用程序將會背離你的預想而運行。
本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要學習記錄以下內容:
建議20、使用泛型集合來替代非泛型集合
建議21、選擇正確的集合
建議22、確保集合的線性安全
http://www.cnblogs.com/aehyok/p/3384637.html 這裡有一篇文章,是我之前專門來介紹泛型的。我們應盡量的使用泛型集合。因為泛型的確有它的好處:
1、提供了類型安全,在編譯期間就可以檢查錯誤
2、更重要的是大部分情況下泛型集合的性能比非泛型集合的性能都高很多。
下面我們來看一段簡單的測試性能的代碼:
collectionCount = Stopwatch watch = testCount = GC.WaitForPendingFinalizers(); GC.Collect(); collectionCount = GC.CollectionCount(); watch = , GC.CollectionCount() - = temp = ( i = ; i < testCount; i++= (= <> list = List<> temp = ( i = ; i < testCount; i++== Main(
執行結果如下
我上面測試的次數是10000000,可以發現,兩者在垃圾回收次數和耗時都差距比較大,所以泛型集合有著非泛型集合無法超越的優勢。所以還是盡量在我們的程序中使用泛型集合吧。
http://www.cnblogs.com/aehyok/p/3643928.html這裡有一篇我剛寫的關於集合的博文,主要是簡單介紹了一下關於自己使用比較頻繁的幾個集合。
如果集合的數目固定並且不涉及轉型,使用數組效率高,否則就是使用List<T>。
像使用數組、ArrayList、List<T>、Dictionary<key,value>這些集合的有點就是插入和刪除數據效率比較高,缺點就是查找的效率相對來說低一些。
關於隊列可以參考http://msdn.microsoft.com/zh-cn/library/System.Collections.Queue(v=vs.80).aspx
關於棧可以參考http://msdn.microsoft.com/zh-cn/library/System.Collections.Stack(v=vs.110).aspx
建議18中提到,foreach循環不能代替for循環的一個原因是在迭代過程中對集合本身進行了增刪操作。將此場景移植到多線程場景中,就是本建議要闡述的重點:確保集合的線程安全。集合線程安全是指在多個線程上添加活刪除元素時,線程之間必須保持同步。
下面我們來通過實例來更詳細的查看一下,先簡單定義一個實體類
Name { ; Age { ;
List<Person> list = List<Person> Person(){ Name=,Age= Person(){Name=,Age= Person(){Name=,Age= AutoResetEvent autoSet = AutoResetEvent( Main(= Thread(() => ( item += Thread(() =>
再來簡單分析一下這段代碼,其實就是閒定義了一個List集合,然後又定義了一個 AutoRestEvent的實例,用於控制線程的。
ArrayList list = Person(){ Name=,Age= Person(){Name=,Age= Person(){Name=,Age= AutoResetEvent autoSet = AutoResetEvent( Main(= Thread(() => (Person item += Thread(() =>
運行結果就是線程一執行通過
如果你試過,那麼會發現泛型集合沒有這樣的屬性來進行加鎖,必須要自己創建一個鎖定對象來完成同步的任務。
所以第一個例子我們可以這樣進行修改
List<Person> list = List<Person> Person(){ Name=,Age= Person(){Name=,Age= Person(){Name=,Age= SyncObject = AutoResetEvent autoSet = AutoResetEvent( Main(= Thread(() => ( item += Thread(() =>
英語小貼士
blind date——相親
online session——在線會議
This depends on you ——這取決於你
I have a date with you——我和你有個約會
poor guy——可憐的家伙,也可以說成(a poor fish)
You look so tall——你看上去很高(形容人高不要用high)
Awesome——令人敬畏的; 使人畏懼的; 可怕的; 極好的
Awesome——聽某某說也可以翻譯成(So.Diao)
作者:aehyok
出處:http://www.cnblogs.com/aehyok/
感謝您的閱讀,如果您對我的博客所講述的內容有興趣,那不妨點個推薦吧,謝謝支持:-O。