偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

.NET 4新增SortedSet類的探討

開發(fā) 后端
本文將為大家介紹的是.NET 4的新增SortedSet類,同時(shí)給大家還推薦了相關(guān)書籍。希望各位.NET程序員能從中受益。

微軟在 .NET 3.5 新增了一個(gè) HashSet 類,在 .NET 4 新增了一個(gè) SortedSet 類,本文介紹他們的特性,并比較他們的異同。

.NET Collection 函數(shù)庫的 HashSet、SortedSet 這兩個(gè)泛型的類,都實(shí)現(xiàn)了 System.Collections.Generic.ISet 接口;但 Java 早在 1.2 (或更早) 之前的版本,即已提供了實(shí)現(xiàn)這兩種數(shù)據(jù)結(jié)構(gòu)的同名類 [10],且還有更嚴(yán)謹(jǐn)?shù)?TreeSet (里面存儲(chǔ)的項(xiàng),連類型都必須一致。當(dāng)年還沒有泛型)。

Set 是「集合」的意思,其在數(shù)學(xué)上的定義,是里面元素的存放沒有特定的順序,且不允許重復(fù)。我們先看以下 HashSet、SortedSet 的示例:

  1. ISet<intset = new HashSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };  
  2. foreach (int element in set)  
  3.     Response.Write(string.Format(" {0}", element));  

 執(zhí)行結(jié)果:


圖 1 重復(fù)的元素自動(dòng)被移除


同樣的代碼,把 HashSet 改成 SortedSet,如下:

  1. ISet<intset = new SortedSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };  
  2. foreach (int element in set)  
  3.     Response.Write(string.Format(" {0}", element));  

 執(zhí)行結(jié)果:


圖 2 重復(fù)的元素自動(dòng)被移除,且內(nèi)部會(huì)自動(dòng)做排序


我們看到 HashSet、SortedSet 這兩個(gè)類,確實(shí)都不允許重復(fù),但前者不會(huì)自動(dòng)做排序,后者會(huì)將加入的元素做排序,且 SortedSet 能夠在插入、刪除和搜索元素時(shí),仍維護(hù)數(shù)據(jù)的排列順序。因此若您有耐心讀到這里,就多學(xué)了一招:若平常編程時(shí)想過濾重復(fù)元素,就可以用這兩個(gè) Set 類,因?yàn)?Set 是不允許重復(fù)元素的。在 SortedSet 還沒出現(xiàn)的 .NET 3.5 時(shí)代,我們必須用 HashSet 先移除重復(fù)的項(xiàng),然后再排序;而現(xiàn)在的 .NET 4,我們就能改用 SortedSet 一步實(shí)現(xiàn)移除重復(fù)并排序。

當(dāng)然,若您的需求不同 (暫不考慮性能問題,下一段會(huì)提到),不希望默認(rèn)自動(dòng)排序,或不需要移除重復(fù)元素,可改用 List 類的 Sort 方法。另 List 結(jié)構(gòu)在數(shù)據(jù)的存儲(chǔ)是有順序的,SortedSet 類也是有序的,但 HashTable 結(jié)構(gòu)、HastSet 類的存儲(chǔ)是無序的。此外,您也可把 HashSet 當(dāng)作 key/value 配對(duì)的 HastTable 之中,只有 keys 沒有 values 的結(jié)構(gòu),因?yàn)?HastSet 類就是實(shí)現(xiàn)了只有 key 的 HashTable 數(shù)據(jù)結(jié)構(gòu),因此除了有極優(yōu)的性能外,元素的存儲(chǔ)是無序的,且不允許重復(fù) (key 必須為唯一)。

此外,Set 在數(shù)學(xué)上沒有元素的數(shù)量上限,但 .NET 中的 Set,則受限于變量可使用的內(nèi)存上限 [14],雖然 .NET HashSet 對(duì)象的容量可隨元素的添加而自動(dòng)增大 [2]。

以下分別列出 .NET 平臺(tái)上,HashSet、SortedSet 這兩個(gè)類各自的一些特性,以及性能方面的比較:HastSet 的特性 [11] :

◆它實(shí)現(xiàn)了數(shù)據(jù)結(jié)構(gòu)中,只有 keys 但沒有 values 的 HashTable [6], [12], [13]。

◆它的 Contains 方法 (確定 HashSet 對(duì)象是否包含指定的元素) 執(zhí)行速度很快,因其為基于「哈希」的查找 (hash-based lookup)。
(另 HashTable 類的檢索速度也是非??斓模洹杆惴ā沟?Time Complexity 接近于 O(1),這是因?yàn)?HashTable 類是以一個(gè)哈希表來實(shí)現(xiàn)的)

◆它的 Add 方法 (將指定的元素添加到 HashSet 對(duì)象中),如果元素?cái)?shù)目小于內(nèi)部數(shù)組的容量,則此方法的運(yùn)算復(fù)雜度為 O(1)。如果必須調(diào)整 HashSet<T> 對(duì)象的大小,則此方法的運(yùn)算復(fù)雜度將為 O(n)。[4]

◆它是無序的容器,亦即元素的存儲(chǔ)是沒有順序的 (此為數(shù)學(xué)上 Set 的特性) [2], [6], [12], [14]。 Java 的 HashSet 亦然。

◆它不能存儲(chǔ)重復(fù)的元素,而且當(dāng)插入的元素有重復(fù)時(shí),也會(huì)自動(dòng)被忽略。

◆無法從特定的位置,訪問其中某個(gè)元素。

SortedSet 的特性 [6]:

◆它實(shí)現(xiàn)了數(shù)據(jù)結(jié)構(gòu)中的「紅黑樹 (Red-Black tree)」[6], [8], [13]。

◆它的 Contains 方法 (確定 SortedSet 對(duì)象是否包含指定的元素) 執(zhí)行速度很快,因其為基于哈希的查找 (hash-based lookup) [6] (這點(diǎn)我不確定,尚待求證)。

◆它的 Add 方法 (將指定的元素添加到 SortedSet 對(duì)象中),如果元素?cái)?shù)目小于內(nèi)部數(shù)組的容量,則此方法的運(yùn)算復(fù)雜度為 O(1)。如果必須調(diào)整 SortedSet<T> 對(duì)象的大小,則此方法的運(yùn)算復(fù)雜度將為 O(n)。[3]

◆它的 Add 方法,若添加了已存在的項(xiàng)時(shí)會(huì)被忽略,并且返回 False。

◆它所存儲(chǔ)的元素是有順序的,雖然它在名稱上也叫做 Set  [1], [6]。 Java 的 SortedSet 亦然。

◆它不能存儲(chǔ)重復(fù)的元素,而且當(dāng)插入的元素有重復(fù)時(shí),也會(huì)自動(dòng)被忽略。

◆無法從特定的位置,訪問其中某個(gè)元素。

以下為我參考坊間數(shù)據(jù)結(jié)構(gòu)的書籍 [15],所轉(zhuǎn)錄的內(nèi)容:

在數(shù)據(jù)結(jié)構(gòu)理論中,由 HashSet 類所實(shí)現(xiàn)的 HashTable,是一種快速「插入」、「查找」的結(jié)構(gòu),且無論有多少的項(xiàng),其「插入、查找」的時(shí)間會(huì)貼近常量時(shí)間,即為 O(1),因此它很適合用在元素?cái)?shù)目相當(dāng)多的時(shí)候。但 HashTable 由于是從「數(shù)組 (Array)」演化來的,因此其擴(kuò)充性很差,且當(dāng)它的空間已滿時(shí),會(huì)造成性能低落。因此我們看 msdn 文檔中 [4],HastSet 成員的 Add 方法、Contains 方法,微軟說他們的運(yùn)算復(fù)雜度為 O(1);但在 Add 方法中又提到,如果必須調(diào)整 HashSet 對(duì)象的大小,則此方法的運(yùn)算復(fù)雜度將為一個(gè) O(n),其中 n 是元素?cái)?shù)目。但若我們?cè)诰幊虝r(shí),能事先預(yù)測(cè)項(xiàng)的數(shù)目,且不需要有順序地瀏覽內(nèi)容,則 HashTable 結(jié)構(gòu)、HashSet 類會(huì)是很適合、高性能的選擇。

在數(shù)據(jù)結(jié)構(gòu)理論中,由 SortedSet 類所實(shí)現(xiàn)的「紅黑樹」,在執(zhí)行將數(shù)據(jù)存儲(chǔ)在內(nèi)存方面,是最有效率的二叉樹。但其「插入」是較緩慢的,其「刪除」的動(dòng)作也較復(fù)雜 (刪除節(jié)點(diǎn)后,必須重新建立紅黑樹的正確架構(gòu))。不過紅黑樹在「排序」數(shù)據(jù)的時(shí)間,不會(huì)超過 O(n)。但 msdn 文檔中 [3],提到 SortedSet 成員的 Add 方法、Contains 方法,微軟說他們的運(yùn)算復(fù)雜度為 O(1),但若 SortedSet 類真的是實(shí)現(xiàn)「紅黑樹」,不禁令人質(zhì)疑 msdn 此處的正確性 [8]。

以下我們來看 .NET 里 HashSet 的一些示例:

示例一 - 測(cè)試查找的功能:

  1. var set = new HashSet<char>("我愛編程");  
  2. Response.Write(set.Contains('我'));  //True  
  3. Response.Write(set.Contains('你'));  //False 

上述示例中,我們能夠?qū)⒆址?,甚至中文字,傳?HashSet<char> 的構(gòu)造函數(shù),是因?yàn)?string 實(shí)現(xiàn)了 IEnumerable<char> 接口,而 HastSet 類也實(shí)現(xiàn)了 IEnumerable<T>。

示例二 - 測(cè)試 HashSet 內(nèi)置的一些好用方法:

  1. SymmetricExceptWith: 僅包含該對(duì)象或指定集合中存在的元素(但不可同時(shí)包含兩者中的元素)。
  2. UnionWith: 包含該對(duì)象本身和指定集合中存在的所有元素。
  3. ExceptWith: 從當(dāng)前 HashSet<T> 對(duì)象中移除指定集合中的所有元素。
  4. IntersectWith: 僅包含該對(duì)象和指定集合中存在的元素。
  1. using System;  
  2. using System.Collections.Generic;  
  3.  
  4. class HashSetDemo  
  5. {  
  6.     static void Main()  
  7.     {  
  8.         HashSet<char> setA = new HashSet<char>();  
  9.         HashSet<char> setB = new HashSet<char>();  
  10.  
  11.         setA.Add('A');  
  12.         setA.Add('B');  
  13.         setA.Add('C');  
  14.  
  15.         setB.Add('C');  
  16.         setB.Add('D');  
  17.         setB.Add('E');  
  18.  
  19.         Show("Initial content of setA: ", setA);  
  20.         Show("Initial content of setB: ", setB);  
  21.  
  22.         setA.SymmetricExceptWith(setB);   //把 setA、setB 各自特有、對(duì)方?jīng)]有的元素列出來  
  23.         Show("setA after Symmetric difference with SetB: ", setA);  
  24.  
  25.         setA.UnionWith(setB);       //把 setA、setB 的全部元素列出來 (union 并集)  
  26.         Show("setA after union with setB: ", setA);  
  27.  
  28.         setA.ExceptWith(setB);      //把 setA 中,所擁有的 setB 元素移除  
  29.         Show("setA after subtracting setB: ", setA);  
  30.  
  31.         Console.WriteLine();  
  32.         Console.Read();  
  33.     }  
  34.     static void Show(string msg, HashSet<charset)  
  35.     {  
  36.         Console.Write(msg);  
  37.         foreach (char ch in set)  
  38.             Console.Write(ch + " ");  
  39.         Console.WriteLine();  
  40.     }  

執(zhí)行結(jié)果:


圖 3 測(cè)試 SymmetricExceptWith、UnionWith、ExceptWith 方法

  1. setA.IntersectWith(setB);     //把 setA 中,所擁有的 setB 元素列出  
  2. Show("setA after intersect with setB: ", setA); 

 執(zhí)行結(jié)果:


圖 4 測(cè)試 IntersectWith 方法


由于 HastSet<T> 實(shí)現(xiàn)了 IEnumerable<T> 接口,因此我們可把其他任何 set 當(dāng)作參數(shù),傳入其他 set 類的運(yùn)算方法里。

此外,LINQ 也有類似上述示例的 Intersect、Except、Union、Distinct 的 set 運(yùn)算功能,有興趣比較兩者特性的網(wǎng)友,可參考 msdn 或網(wǎng)絡(luò)上的文章 [5]。主要的差別在于,LINQ set 運(yùn)算始終返回新的 IEnumerable<T> 集合,而 HashSet<T> 是修改當(dāng)前的集合,且 HashSet 提供了比較多的 set 相關(guān)算符。

到了 .NET 4 才新建的 SortedSet 類,除了有前述 HashSet 類所擁有的 SymmetricExceptWith、UnionWith、ExceptWith、IntersectWith 等好用的方法外,還有「GetViewBetween (制定范圍)」、「Max (取最大值)」、「Min (取最小值)」等新增的好用方法。

以下我們來看 SortedSet 這三個(gè)方法的示例:

示例三 - 測(cè)試 GetViewBetween、Max、Min 方法:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;    //此為 Max()、Min() 方法的必要引用  
  4.  
  5. var set = new SortedSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };  
  6.  
  7. foreach (int element in set)  
  8.     Response.Write(string.Format(" {0}", element));  
  9.  
  10. Response.Write("<p>");  
  11. Response.Write("Max: " + set.Max() + "<br>");  
  12. Response.Write("Min: " + set.Min() + "<br>");  
  13.  
  14. Response.Write("<br>取 2 ~ 5 之間的值: <br>");  
  15.  
  16. //只取值為 2 ~ 5 之間的元素  
  17. var subSet = set.GetViewBetween(2, 5);  
  18. foreach (int i in subSet)  
  19. {              
  20.     Response.Write(i + ",");  

執(zhí)行結(jié)果:


圖 5 測(cè)試 SortedSet 類專屬的 GetViewBetween、Max、Min 方法

此 GetViewBetween() 方法,也適用于 SortedSort 里元素為字符串、字符的處理 [6]。

參考資料:

[1] SortedSet<T> 類
http://msdn.microsoft.com/zh-cn/library/dd412070.aspx

[2] HashSet<T> 類
http://msdn.microsoft.com/zh-cn/library/bb359438.aspx

[3] SortedSet<T> 成員
http://msdn.microsoft.com/zh-cn/library/dd382202.aspx

[4] HashSet<T> 成員
http://msdn.microsoft.com/zh-cn/library/bb341004.aspx

[5] HashSet 和 LINQ Set 運(yùn)算
http://msdn.microsoft.com/zh-cn/library/bb397728.aspx
http://www.dotblogs.com.tw/kirkchen/archive/2010/06/12/15836.aspx

[6] C# 4.0/BCL 4 Series:SortedSet<T> in Framework 4
http://samgentile.com/Web/vs2010-and-net-framework-4-0/c-4-0-bcl-4-series-sortedset-lt-t-gt-in-framework-4/

[7] SortedSet Collection Class in .NET 4.0
http://www.codeproject.com/KB/cs/SortedSet_T__Collection.aspx

[8] Add to SortedSet<T> and its complexity
http://stackoverflow.com/questions/2533007/add-to-sortedsett-and-its-complexity

[9] Net4.0---Framwork新增特性
http://www.cnblogs.com/oec2003/archive/2010/05/26/1744495.html

[10] 用 Java 的 SortedSet 實(shí)現(xiàn)過濾重復(fù)字符串并排序
http://www.cnblogs.com/fzzl/archive/2009/04/01/1427344.html
http://www.cnblogs.com/fzzl/archive/2009/04/01/1427336.html


參考書籍:

[11] C# 3.0 in a Nutshell, chapter 7
http://www.amazon.com/3-0-Nutshell-Desktop-Reference-OReilly/dp/0596527578

[12] C# 3.0 THE COMPLETE REFERENCE, chapter 24
http://www.amazon.com/3-0-COMPLETE-REFERENCE-Herbert-Schildt/dp/0071588418/ref=sr_1_11?ie=UTF8&s=books&qid=1276701548&sr=1-11

[13] C# 4.0 in a Nutshell
http://www.amazon.com/C-4-0-Nutshell-Definitive-Reference/dp/0596800959/ref=sr_1_1?ie=UTF8&s=books&qid=1276783191&sr=1-1
http://www.albahari.com/nutshell/

[14] C# 2010 All-in-One For Dummies
http://www.amazon.com/C-2010-All-One-Dummies/dp/0470563486

[15] Java 在數(shù)據(jù)結(jié)構(gòu)及算法的應(yīng)用
作者:胡銘珍,出版社:全華科技圖書,語文:繁體中文,ISBN: 957-21-3923-1

原文標(biāo)題:探討 .NET 4 新增的 SortedSet 類 

鏈接:http://www.cnblogs.com/WizardWu/archive/2010/06/17/1759297.html

【編輯推薦】

  1. 使用ASP.NET 4的自動(dòng)啟動(dòng)特性
  2. 詳解.NET 4.0并行計(jì)算支持歷史
  3. 詳讀.NET 4.0環(huán)境配置
  4. 詳解.NET 4.0中異常處理方面的新特性
  5. 三方面詮釋.NET 4.0的新特性

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2011-06-11 22:09:06

NET聯(lián)合體

2011-07-12 09:18:50

.NET

2009-07-15 17:43:20

Jython類

2011-03-16 08:59:29

.NET強(qiáng)名稱

2009-08-13 16:57:37

.NET緩存機(jī)制

2011-06-22 16:37:03

SEO

2009-12-07 16:07:03

PHP類的繼承

2009-03-13 09:31:03

.NET整合分布式應(yīng)用

2009-05-11 13:48:00

ASP.NET 2.0緩存效率

2010-01-19 18:24:29

VB.NET調(diào)用Win

2009-12-28 10:04:59

.NET 4.0數(shù)組

2013-08-06 13:58:27

2009-11-04 11:32:20

VB.NET回調(diào)函數(shù)

2009-10-30 16:31:55

VB.NET重載方法

2009-12-28 15:11:36

ADO.NET專家

2009-12-17 13:33:14

VS2005類

2011-02-25 09:23:00

Java類加載器

2010-01-04 13:06:50

ADO.NET事務(wù)

2010-01-05 14:45:58

.NET Framew

2009-12-24 16:56:21

ADO.NET庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)