总结:C# Collections

(准确的说是.Net的。但我只对C#比较熟,像VB.Net之类的还有自己以前的一些集合类带过来暂不考虑。下面以.Net 2.0的BCL为准,它至少到3.5都没大变化。)

首先,我们第一眼看上去,.Net和Java是类似的。要相信自己的直觉。虽然深入点看在太多的地方不同,但对于不和平台实现细节、OS、第三方支持等等密切相关的任务,它们就是差不多的。而我想它们的很多应用场景就是不需要考虑细节的。

那么,呵呵,他们的集合框架也是差不多的。。多啊、乱啊。。幸好.Net里的基本都在这些的namespace下面:System.Collections.GenericSystem.CollectionsSystem.Collections.Specialized

MSDN上面的C# Programming Guide里面的Collection Classes是不错的介绍。

下面还是和Java那篇一样,先来最通用的部分:
        Non-Generic                    Similar Generic Type
     ArrayList              List<T>
     Hashtable              Dictionary<TKey,TValue>
     SortedList             SortedList<TKey,TValue>
     Queue                  Queue<T>
     Stack                  Stack<T>
     IEnumerable            IEnumerable<T>
     ICollection            N/A (use IEnumerable<T> anything that extends it)
     N/A                    ICollection<T>
     IList                  IList<T>
     CollectionBase         Collection<T>
     ReadOnlyCollectionBase ReadOnlyCollection<T>
     DictionaryBase         N/A (just implement IDictionary<TKey,TValue>
     N/A                    SortedDictionary<TKey,TValue>
     N/A                    KeyedCollection<TKey,TItem>
     N/A                    LinkedList<T>


上面是从这里贴出来的,那篇post值得一看。
通过这个可以看出1.1到2.0泛型的引入和集合类的大大增强。Java也是受了.Net的影响才搞泛型的(关于C#和Java泛型哪个更好的对骂可以搜到一大堆)。我还没深入了解.Net和Java泛型的细节区别,不过看看.Net泛型的集合类,都是既实现了泛型接口又实现了非泛型接口:
System.Collections.Generic下的集合类,点击加号展开!

而Java是在以前的接口和类上加泛型功能,可能是两家对泛型的哲学不同吧。以后我需要搞懂。
总之,.Net新开了个System.Collections.Generic,然后把很多类名字都变了,namespace里面其他平时大家看不到的类的结构,比如接口的关系,也重新设计一遍。
取新类名也可能和下面问题有关,点击加号展开!

结果.Net取的类名很搞。ArrayList这么明确的名字,换成List<T>。。
本来好好的HashTable,叫成Dictionary<T, K>,更脑残的是其实还有个类叫HashSet<K>,就不能自我统一点啊。
接着SortedDictionary也让人郁闷,以前本来没红黑树实现的,新加一个名字取得和哈希的Dictionary有关系一样。

SortedDictionary和SortedList,一个是搜索树,一个是排序的数组、查找用二分。记得IComparable和IComparator.Compare()哦~
下载的ReferenceSource里的注释,Object.GetHashCode()默认返回当前对象的SyncBlock的索引号,但是照这里看这个值是会变的。。回去翻翻《CLR via C#》。。
还有一点,.Net里面暂时没有堆的实现。

Selecting a Collection Class以及Collections and Data Structures,可以作为提纲帮助我们把C#的集合过一遍。
个人觉得,同步要领要知道些,有时间再学学java.util.concurrent里面怎么结合无锁的,不常用的集合类也要清楚什么时候合适用~

最后,用到MS的集合类,就不能不说LINQ,当然LINQ to SQL应该会比其他LINQ更常用的~
不过我想多又一层封装,用不好就成效率问题,所以还是要熟悉了再用。


References:
http://msdn.microsoft.com/en-us/library/ybcx56wz.aspx
http://blogs.msdn.com/kcwalina/archive/2005/09/23/Collections.aspx
http://blogs.msdn.com/kcwalina/archive/2008/04/02/SimulatedCovariance.aspx
posted @ 2008-06-30 00:33 VeryDxZ 阅读(...) 评论(...)  编辑 收藏