StringCollection FAQ [C#, BCL]

Updated on Monday, March 21, 2005

Written by Allen Lee

Q:如何使用StringCollection[1]?

A:通常我们有三种方法来访问StringCollection里面的string元素:

// Code #01

StringCollection sc = new StringCollection();
sc.AddRange(textBox1.Lines);

// StringCollection used together with StringEnumerator.
StringEnumerator se = sc.GetEnumerator();
while (se.MoveNext())
{
    Console.WriteLine(se.Current);
}

// 'foreach' syntax used.
foreach(string str in sc)
{
    Console.WriteLine(str);
}

// 'for' syntax used.
for(int i = 0; i < sc.Count; i++)
{
    Console.WriteLine(sc[i]);
}

Q:与ArrayList相比,StringCollection有什么优势?

A:首先让我们来看看如下代码:

// Code #02

// StringCollection used for Strings operation.
StringCollection sc = new StringCollection();
sc.AddRange(textBox1.Lines);

foreach (string str in sc)
{
    if (str.Trim().StartsWith("File"))
    {
        // Do something
    }
    else if (str.Trim().StartsWith("Registry"))
    {
        // Do something else
    }
}

// ArrayList used for Strings operation.
ArrayList al = new ArrayList();
al.AddRange(textBox1.Lines);

foreach (object obj in al)
{
    string str = (string)obj;

    if (str.Trim().StartsWith("File"))
    {
        // Do something
    }
    else if (str.Trim().StartsWith("Registry"))
    {
        // Do something else
    }
}

从上面的代码我们看可以看出,用StringCollection写出的代码更加直观(尤其在你要对集合里面的String元素进行复杂的操作的时候),清楚地表明了集合里面的元素的性质,并且免除我们手动进行强类型转换。

Q:StringCollection是否为string作了专门的优化?

A:没有!这可能是一个最大的误解,别看到StringCollection只用来储存string就以为它为string的储存作了专门的优化!

虽然在某程度上用StringCollection写的代码比ArrayList的更加直观,然而后者却在性能上稍胜一筹[2]。事实上,StringCollection只是对ArrayList进行了一番装裱而已(以下是使用Reflector反编译的StringCollection代码片断):

// Code #03

[Serializable]
public class StringCollection : IList, ICollection, IEnumerable
{
    // Methods
    public void AddRange(string[] value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        this.data.AddRange(value);
    }

    // Other methods omitted

    // Properties
    public string this[int index]
    {
        get { return (string) this.data[index]; }
        set { this.data[index] = value; }
    }

    // Other properties omitted

    // Fields
    private ArrayList data;
}

从代码中我们可以看到StringCollection实质上把其所提供的功能重定向给ArrayList,它们的关系是Use-A。

Q:在什么情况下我们应该使用StringCollection呢?

A:这个问题没有标准答案,视你所要处理的问题和你的处理原则而定。首先,让我们来听听Robert B. Murray的想法:

程序的正确性要比它的速度更重要。和人力资源相比,计算机的运行时间的开销会变得越来越便宜;对于那些在提高性能的同时还会导致程序的可理解性和可维护性变差的方法,我们应该持谨慎对待。[3]

于是,一般说来,使用StringCollection而不是ArrayList是有一定作用的。但就我个人来说,我已经习惯了使用ArrayList。当然,如果你使用的是.NET 2.0,那么List会是你不二的选择,它结合了StringCollection和ArrayList的优点——代码直观和性能优良!

// Code #04

List<string> ls = new List<string>();
ls.AddRange(textBox1.Lines);

foreach (string str in ls)
{
    if (str.Trim().StartsWith("File"))
    {
        // Do something
    }
    else if (str.Trim().StartsWith("Registry"))
    {
        // Do something else
    }
}

关于这个问题,我也请教了Kit George:

Kit,

Hi, I'm Allen Lee. I want to ask you in what situations we shall use System.Collection.Specialized.StringCollection? When I used Reflector to deassembly .NET, I found that StringCollection actually uses a ArrayList to provide its functions and it doesn't have a better performance than ArrayList! What's more, in .NET 2.0, we have generics; then is it necessary to use StringCollection or leave it alone in our future development?

I'm looking forward to hearing from you! Thanks!

Yours, sincerely
Allen Lee
Friday, March 18, 2005

Allen: leave it alone, and use List. StringCollection should probably be avoided now we have generics.

可见,在.NET 2.0中,泛型集合类应该作为我们处理这类问题的首选工具。如果你对使用泛型集合类感兴趣的话,可以看看《Power Collections - An Extension Library for System.Collections.Generic》这个MSDN TV。

StringCollection FAQ [C#, BCL]相关推荐

  1. 《博客园精华集---CLR/C#分册》

    <博客园精华集---CLR/C#分册> 转:http://www.cnblogs.com/anytao/archive/2008/09/04/lovechina_bestclr_3rdfi ...

  2. 《博客园精华集---CLR/C#分册》第三轮筛选结果 转载

    好文集锦 发布日期:2008.9.4 作者:Anytao 精华集CLR/C#分册,经过一段时间三轮筛选努力,终于有了一个初步结果.虽然这个过程历时较长,又因快乐奥运而放松了一段岁月,今天终于可以将第三 ...

  3. 《博客园精华集---CLR/C#分册》第三轮筛选结果

    <博客园精华集---CLR/C#分册>第三轮筛选结果 发布日期:2008.9.4 作者:Anytao 精华集CLR/C#分册,经过一段时间三轮筛选努力,终于有了一个初步结果.虽然这个过程历 ...

  4. OpenSolaris/Solaris中文FAQ

    本文转载于 http://blog.chinaunix.net/uid-11193716-id-2896321.html OpenSolaris/Solaris中文FAQ (2008-08-04 19 ...

  5. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  6. llvm常见问题 (FAQ)

    llvm常见问题 (FAQ) License 可以修改 LLVM 源代码并重新分发修改后的源代码吗? 可以修改 LLVM 源代码并重新分发基于二进制文件或其它工具,而无需重新分发源代码吗? 源代码 L ...

  7. 跨站脚本攻击(XSS)FAQ

    原作者charlee.原始链接http://tech.idv2.com/2006/08/30/xss-faq/以及本声明. 该文章简单地介绍了XSS的基础知识及其危害和预防方法.Web开发人员的必读. ...

  8. Mininet FAQ

    2019独角兽企业重金招聘Python工程师标准>>> FAQ lantz edited this page on 20 Oct · 324 revisions Pages 65 M ...

  9. 使用Harry过程中FAQ(问题解答)

    使用Harry过程中FAQ(问题解答) Harry-Vue 启动报错信息 Cannot find module错误信息 Harry-Vue 的路由在nginx中刷新出现404 一.Harry-Vue ...

最新文章

  1. 手机屏幕 高宽有哪些_企业文化不仅要上墙,更要霸屏!企业文化如何在线上进行宣传?如何在屏幕上宣传?看这篇就够了!...
  2. python 爬虫实例-Python 爬虫:Scrapy 实例(二)
  3. ------shell学习
  4. Ulink2 No Ulink Device found 解决办法
  5. mysql 共享锁_mysql有排他锁为什么还需要共享锁呢?
  6. linux内核之kfifo队列
  7. iOS中事件的传递和响应者链条
  8. 计算机系统中字word的描述性定义是,计算机基础练习题1
  9. igxe本地机器人怎么用_RPA 9.0 前瞻系列 - 机器人共享
  10. 关于 c++ opencv [ INFO:0] global c:\build\master_winpack-build-win64-vc15\***
  11. 《手机游戏引擎架构》信息总汇
  12. 系统重温Pandas笔记:(八)文本数据
  13. python爬取公众号文章数据库,爬取微信公众号所有文章的请教
  14. 面试题整理 自问自答
  15. TCP缓冲区大小及限制
  16. 共同父域下的单点登录
  17. Android 错把setLayerType当成硬件加速
  18. Linux 配置GitHub秘钥 并上传
  19. CISC, RISC 区别
  20. 【C++学习】 设计案例1:设计立方体类

热门文章

  1. 第九章 思科竞争谋略
  2. FZOJ 2014年11月份月赛 ytaaa(dp + RMQ)
  3. eayUi panel实现上一页下一页
  4. JavaScript学习笔记之数组(二)
  5. hdu 3018 Ant Trip
  6. Linux bridge 资料链接
  7. C程序中常见的内存操作错误
  8. [iphone]XML 解析 之 TBXML 介绍
  9. 算法练习之leetcode两数相加(1)
  10. 【转】C++ this指针(直戳本质)