標籤:

誰能通俗易懂的講解下C#中的集合?

c#


沒人能,因為這本身就不是一個通俗易懂的話題。

一些老生常談的內容,例如不同集合有哪些操作,不同操作的效率如何,分別適合什麼樣的場景就不提了,我來說幾個實踐中會遇到的複雜話題,也是會經常被人忽視的。這些問題不一定有標準答案,或者說標準答案會很複雜(分很多不同情形),所以我只提一下,給不了答案。

首先,它們在多線程環境下表現如何。就拿字典來說,現在雖然有了ConcurrentDictionary,但是它在任何情況下都是最好的么?

  1. 只需初始化一次,後續並發讀,我們應該用什麼?提示:不是ConcurrentDictionary。
  2. 單線程寫,多線程讀,我們應該用什麼?提示,不(一定)是ConcurrentDictionary。
  3. M線程寫,N線程讀,我們應該用什麼?我也不知道,可能是ConcurrentDictionary。

其次,它們的內存使用如何,對於一個集合實現,考慮以下情況:

  1. 默認構造函數,會生成多大的數據。
  2. 很多集合的構造函數接受capacity,傳入N時會生成多大的數據。
  3. 當集合內有N個元素的時候,會佔多少內存。
  4. 當N個元素是一個個加進去,或是一起加進去(例如構造函數里),內存佔用分別是多少,整個過程分配了多少內存。
  5. 內存布局如何,是連續的還是分散的,效率如何?添加了N個再去掉了M個,和添加(N-M)個有區別嗎?

上面的問題還會延伸出下面一些更具體的。

  1. 在數據量不同的情況下,應該選用什麼樣的實現。例如,我就一小撮元素,使用Dictionary是更好的選擇嗎?
  2. 在數據集合有限的情況下如何,例如我們知道假如鍵是1~100的整數,我們可以直接開數組。實踐中可以有其它能利用的限制,或者沒有限制我們可以創造限制(甚至可以假設一個限制,等出現例外的時候再切換到普通方案)。
  3. 需要在修改時獲得新的集合而不是修改舊的,是使用Immutable集合呢,還是自己複製一份?注意,這跟修改的頻率和數據量大小也有關係。

還有一些是和.NET具體實現相關的。

  1. 完整擼一遍所有元素開銷如何,是不是有更快地擼法?
  2. 是不是漏了該有的一些功能,例如我們知道SortedDictionary是紅黑樹,但提供完整紅黑樹功能的嗎?
  3. ImmutableList用樹實現了IList介面(的讀操作),那麼我們可不可以用樹來實現個可讀寫的List?

所以最重要的還是自己思考和實驗。當然還有追求,當你追求得多一點,你就會在系統里放入好多自己實現的集合類型了。


難得有人邀請我 感謝。

誰能通俗易懂的講解下C#中的集合?

這是問題 那麼我的回答是 MSDN

請大家將教材打開 翻到 集合和數據結構

類似的數據在作為集合而存儲和操作時通常可以得到更高效地處理。 您可以使用System.Array類或中的類System.Collections, System.Collections.Generic, System.Collections.Concurrent,System.Collections.Immutable 命名空間,以添加、 刪除和修改單個元素或某個範圍的集合中的元素。

去掉中間的干擾信息 注意看下劃線的部分 基本上就是.net 中集合需要解決的問題:

更高效地處理,類似的數據, 添加、 刪除和修改單個元素或某個範圍的集合中的元素

注意,在MSDN每一個類型標題下的第一句提綱掣領的一句 就是最通俗易懂的描述

如果要詳細講解.net 集合中集合都有什麼用,同樣的可以找到這句金句來反覆理解。

學習集合首先要從介面/契約開始, 要知道解決問題的類型。

比如:IList 介面 (System.Collections) 的第一句話

表示可按照索引單獨訪問的對象的非泛型集合。

說明了所有List 集合的終極問題與答案。

又如:IDictionary(TKey, TValue) 介面 (System.Collections.Generic)

表示鍵/值對的泛型集合。

已經不能再簡明了。

當熟悉了解決問題的類型後,我們再學習解決的不同方法,也就是實現的特質有什麼不同

SortedDictionary(TKey, TValue) 類 (System.Collections.Generic) 中的描述

表示根據鍵進行排序的鍵/值對的集合。

與 Dictionary(TKey, TValue) 類 (System.Collections.Generic) 中的描述

表示鍵和值的集合。

對比有多清晰?

然後下面馬上就有本類的源代碼可以給你看啦。不要太方便。

我們小時候有過經驗,學會了拼音以後,我們可以抱著一本字典挨個看字學讀音,比到處問父母這個字怎麼念強到不知道哪裡去了。

有效地使用工具書/圖書館,選擇正確的權威的知識來源,對我們的個人成長 是事半功倍的。

這裡沒有直接針對魚有什麼答案,因為全世界的魚大同小異。說了一點打漁心得 希望能幫得上忙。


ASP.NET夜話之二十一asp.net網站的性能優化 - 周公(周金橋)的專欄 - 博客頻道 - CSDN.NET

上面的鏈接中簡單講了一下:

在.NET Framework中提供了很多集合類,如ArrayList、BitArray、Hashtable、Queue、SortedList、Stack、ListDictionary、NameValueCollection、OrderedDictionary、StringCollection、List&及數組等,要了解各個集合的特性,選擇合適的集合。在所有的集合中數組是性能最高的,如果要存儲的數據類型一致和容量固定,特別是對值類型的數組進行操作時沒有裝箱和拆箱操作,效率極高。

在選擇集合類型時應考慮幾點:

(1)集合中的元素類型是否是一致的,比如集合中將要存儲的元素都是int或者都是string類型的就可以考慮使用數組或者泛型集合,這樣在存儲數值類型元素就可以避免裝箱拆箱操作,即使是引用類型的元素也可以避免類型轉換操作。

(2)集合中的元素個數是否是固定的,如果集合中存儲的元素是固定的並且元素類型是一致的就可以使用數組來存儲。

(3)將來對集合的操作集中在那些方面,如果對集合的操作以查找居多可以考慮HashTable或者Dictionary&這樣的集合,因為在.NET Framework中對這類集合採用了特殊機制,所以在查找時比較的次數比其它集合要少。

另外,在使用可變集合時如果不制定初始容量大小,系統會使用一個默認值來指定可變集合的初始容量大小,如果將來元素個數超過初始容量大小就會先在內部重新構建一個集合,再將原來集合中的元素複製到新集合中,可以在實例化可變集合時指定一個相對較大的初始容量,這樣在向可變集合中添加大量元素時就可以避免集合擴充容量帶來的性能損失。

using System;

using System.Collections;

using System.Collections.Generic;

/// &

/// 用來&測試&對集合進行操作所花費的時間

/// &

public class CollectionDemo

{

public static void Main()

{

Test(100000);

Console.WriteLine("==========");

Test(1000000);

Console.WriteLine("==========");

Test(10000000);

Console.ReadLine();

}

/// &

/// 操作數組

/// &

/// &

要操作的次數&

/// &&

private static TimeSpan ArrayOperation(int maxCount)

{

//在程序開始運行時記錄下系統當前時間

DateTime start = DateTime.Now;

int[] intList = new int[maxCount];

int j = 0;

for (int i = 0; i &< maxCount; i++) { intList[i] = i; } for (int i = 0; i &< maxCount; i++) { j = intList[i]; } //在程序結束後記錄下系統當前時間 DateTime end = DateTime.Now; //用程序結束的系統時間減去開始運行時的時間就是代碼運行時間 return end - start; } /// &

///

/// &

/// &

&

/// &&

private static TimeSpan ArrayListOperation(int maxCount)

{

//在程序開始運行時記錄下系統當前時間

DateTime start = DateTime.Now;

//用默認的容量來初始化ArrayList

//ArrayList intList = new ArrayList();

//用指定的容量來初始化ArrayList

ArrayList intList = new ArrayList(maxCount);

int j = 0;

for (int i = 0; i &< maxCount; i++) { intList.Add(i); } for (int i = 0; i &< maxCount; i++) { j = (int)intList[i]; } //在程序結束後記錄下系統當前時間 DateTime end = DateTime.Now; return end - start; } /// &

///

/// &

/// &

&

/// &&

private static TimeSpan GenericListOperation(int maxCount)

{

//在程序開始運行時記錄下系統當前時間

DateTime start = DateTime.Now;

//用默認的容量來初始化泛型集合

//List& intList = new List&();

//用指定的容量來初始化泛型集合

List& intList = new List&(maxCount);

int j = 0;

for (int i = 0; i &< maxCount; i++) { intList.Add(i); } for (int i = 0; i &< maxCount; i++) { j = intList[i]; } //在程序結束後記錄下系統當前時間 DateTime end = DateTime.Now; return end - start; } private static void Test(int maxCount) { TimeSpan ts1 = ArrayOperation(maxCount); TimeSpan ts2 = ArrayListOperation(maxCount); TimeSpan ts3 = GenericListOperation(maxCount); Console.WriteLine("執行" + maxCount + "次操作:"); Console.WriteLine("數組耗時" + ts1.TotalMilliseconds + "毫秒"); Console.WriteLine("ArrayList耗時" + ts2.TotalMilliseconds + "毫秒"); Console.WriteLine("泛型集合耗時" + ts3.TotalMilliseconds + "毫秒"); } }


數組懂吧?集合就當做不定長的數組好了


謝邀。可惜我有五六年沒碰C#,當時碰也是挺短時間的。給不了建議。

我一直從事的語言是C/C++,彙編。現在做JAVA。python和PHP都碰,說到集合類方面的東西,還是努力把數據結構學懂,基本上這些結構用一下,就知道它裡面是用了什麼數據結構,是數組還是鏈表,還是樹之類。然後很多特性就自然而然了。



如果你用過js中的array就好理解,在c#一般不用數組而用集合,使用上差不多就等於js中的array。具體性能啦,其他什麼的,就讓大神們研究吧,我們這種小白,會用就好


看了其它人的,感覺都不是很通俗集合。。

1.集合我認為就是一個高級的數組。在數組的基礎上加了一些類型規範的東西。。數組是死的,集合是活的呀。。當集合初始化之後,就更靈活的增刪改查了。

2.集合和一些高級特性的結合。這些高級特性我也用的不是很清楚,不過基礎上用不到這些高級特性。

3.完全可以用list&<&>來處理你遇到的絕大部分問題,只要你需要用到一類對象但又不止一個,就可以用list&<&>

至於更嚴謹的說法,我認為沒有必要。一個是大部分人用不到,二個是自己真用到時,那會也水平很高了,自然就通了


用來放一組對象 方便管理


分四步

1.去看 數據結構相關書籍前幾章

2.去複習高中數學集合部分

3.去看msdn看 . net 集合相關文檔

4.還有啥問題


為何不看書呢

比如說下面這本書的附錄B:


推薦閱讀:

這些書閱讀的先後順序是什麼?
未來兩到三年會學習 C# ,如何做好自己的學習計劃?
C#7新增的模式匹配為什麼不是表達式?
C# 中為什麼List<List<T>> 不能轉換為 IList<IList<T>> ?

TAG:C# | C#編程 |