StringCollection? ArrayList? HashSet?——BCL里一些容器的问题

昨天师兄提到他们的程序有high-CPU的问题,要想办法解决。其中一个可能出现问题的地方是程序里采用的容器。

在需要用“Set”的地方,他们用了ArrayList,而且没排序(因而用不了BinarySearch)。我一开始还没反应过来,心想该用Set的地方用ArrayList那不就是见鬼么;外加容器内容没排序,要查找就是线性的搜索了(大概是用了foreach来找?诶……)。要是用HashSet不好么。
后来才想起来,.NET Framework一直到3.0都没有HashSet这种容器,也没有ISet这样的接口。有好几种workaround,包括自己动手包装一个Hashtable/SortedList之类,或者用[url=http://www.codeproject.com/KB/recipes/sets.aspx]codeproject上的一个Set[/url](还有[url=http://www.codeproject.com/KB/collections/SetCollectionsForCSharp.aspx]这里[/url]提到的好几个)。或者用[url=http://www.itu.dk/research/c5/]C5[/url]也可以。问题是公司里的project多半不会容许采用第三方实现的容器吧,于是codeproject和C5都用不了。只能自己动手了……

一开始没反应过来是因为在Java里用java.util.HashSet用得很习惯了,都没想过.NET这边会没有这个容器。只记得在.NET Framework 2.0之前是没有链表,后来增加了System.Collections.Generic.LinkedList<T>。
然后查了下,发觉.NET Framework 3.5里终于有[url=http://msdn2.microsoft.com/en-us/library/bb495294.aspx]System.Collections.Generic.HashSet<T>[/url]了。可惜师兄碰到的问题是面向.NET Framework 2.0的,这就没办法了……


然后师兄又提到说看到一个建议:在储存string时,应该使用System.Collections.Specialized.StringCollection而不要使用ArrayList。结果我又没反应过来。我在想,不用ArrayList?用ArrayList<String>不好么?
然后马上想起.NET Framework里没有ArrayList<T>,Java里倒是有。在.NET Framework 2.0里那容器叫 List<T>。我又弄混了啊(抱头
OK,那么.NET的ArrayList不是泛型的。那为什么要用StringCollection而不用ArrayList呢?查了下,原来StringCollection就是一个实现了IList接口的、对ArrayList的包装而已。换句话说它不过是在.NET Framework 2.0出来之前的一个老办法而已;它的实现里仍然用到了cast。在2.0之后用List<string>就不需要cast,效率应该更好一些才对(未必有多明显就是了)。

那些“建议”啊或者best practice什么的,都是有时限的啊……诶。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值