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

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

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

一开始没反应过来是因为在Java里用java.util.HashSet用得很习惯了,都没想过.NET这边会没有这个容器。只记得在.NET Framework 2.0之前是没有链表,后来增加了System.Collections.Generic.LinkedList<T>。
然后查了下,发觉.NET Framework 3.5里终于有 System.Collections.Generic.HashSet<T>了。可惜师兄碰到的问题是面向.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什么的,都是有时限的啊……诶。

你可能感兴趣的:(.net,正则表达式,Microsoft)