博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
StringCollection FAQ [C#, BCL]
阅读量:6472 次
发布时间:2019-06-23

本文共 3466 字,大约阅读时间需要 11 分钟。

StringCollection FAQ [C#, BCL]

 

Updated on Monday, March 21, 2005

 

Written by Allen Lee

Q:如何使用StringCollection[1]

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

None.gif
//
 Code #01
None.gif
None.gifStringCollection sc 
=
 
new
 StringCollection();
None.gifsc.AddRange(textBox1.Lines);
None.gif
None.gif
//
 StringCollection used together with StringEnumerator.
None.gif
StringEnumerator se 
=
 sc.GetEnumerator();
None.gif
while
 (se.MoveNext())
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    Console.WriteLine(se.Current);
ExpandedBlockEnd.gif}
None.gif
None.gif
//
 'foreach' syntax used.
None.gif
foreach
(
string
 str 
in
 sc)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    Console.WriteLine(str);
ExpandedBlockEnd.gif}
None.gif
None.gif
//
 'for' syntax used.
None.gif
for
(
int
 i 
=
 
0
; i 
<
 sc.Count; i
++
)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    Console.WriteLine(sc[i]);
ExpandedBlockEnd.gif}

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

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

None.gif
//
 Code #02
None.gif
None.gif
//
 StringCollection used for Strings operation.
None.gif
StringCollection sc 
=
 
new
 StringCollection();
None.gifsc.AddRange(textBox1.Lines);
None.gif
None.gif
foreach
 (
string
 str 
in
 sc)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    
if (str.Trim().StartsWith("File"))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Do somethingdot.gif
ExpandedSubBlockEnd.gif
    }
InBlock.gif    
else if (str.Trim().StartsWith("Registry"))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Do something elsedot.gif
ExpandedSubBlockEnd.gif
    }
ExpandedBlockEnd.gif}
None.gif
None.gif
//
 ArrayList used for Strings operation.
None.gif
ArrayList al 
=
 
new
 ArrayList();
None.gifal.AddRange(textBox1.Lines);
None.gif
None.gif
foreach
 (
object
 obj 
in
 al)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    
string str = (string)obj;
InBlock.gif
InBlock.gif    
if (str.Trim().StartsWith("File"))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Do somethingdot.gif
ExpandedSubBlockEnd.gif
    }
InBlock.gif    
else if (str.Trim().StartsWith("Registry"))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Do something elsedot.gif
ExpandedSubBlockEnd.gif
    }
ExpandedBlockEnd.gif}

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

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

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

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

None.gif
//
 Code #03
None.gif
None.gif[Serializable]
None.gif
public
 
class
 StringCollection : IList, ICollection, IEnumerable
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    
// Methods
InBlock.gif
    public void AddRange(string[] value)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (value == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
throw new ArgumentNullException("value");
ExpandedSubBlockEnd.gif        }
InBlock.gif        
this.data.AddRange(value);
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
// Other methods omitteddot.gif
InBlock.gif
InBlock.gif    
// Properties
InBlock.gif
    public string this[int index]
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn (stringthis.data[index]; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gifthis.data[index] = value; }
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
// Other properties omitteddot.gif
InBlock.gif
InBlock.gif    
// Fields
InBlock.gif
    private ArrayList data;
ExpandedBlockEnd.gif}

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

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

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

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

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

None.gif
//
 Code #04
None.gif
None.gifList
<
string
>
 ls 
=
 
new
 List
<
string
>
();
None.gifls.AddRange(textBox1.Lines);
None.gif
None.gif
foreach
 (
string
 str 
in
 ls)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    
if (str.Trim().StartsWith("File"))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Do somethingdot.gif
ExpandedSubBlockEnd.gif
    }
InBlock.gif    
else if (str.Trim().StartsWith("Registry"))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// Do something elsedot.gif
ExpandedSubBlockEnd.gif
    }
ExpandedBlockEnd.gif}

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

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中,泛型集合类应该作为我们处理这类问题的首选工具。如果你对使用泛型集合类感兴趣的话,可以看看这个MSDN TV。

 


  • [1] 该集合类位于System.Collections.Specialized命名空间。
  • [2] 关于StringCollection和ArrayList的性能比较,可以参考。
  • [3]

 

转载地址:http://ayvko.baihongyu.com/

你可能感兴趣的文章
Flutter之MaterialApp使用详解
查看>>
DataBinding最全使用说明
查看>>
原生Js交互之DSBridge
查看>>
Matlab编程之——卷积神经网络CNN代码解析
查看>>
白洋淀周末游
查看>>
三篇文章了解 TiDB 技术内幕 —— 说计算
查看>>
copy strong weak assign的区别
查看>>
OpenCV 入门
查看>>
css 3D transform变换
查看>>
ele表格合并行之后的selection选中
查看>>
正则表达式分解剖析(一文悟透正则表达式)
查看>>
解决UILable标点符号居中的问题
查看>>
HTML5新特性教程
查看>>
SpringBoot 实战 (十七) | 整合 WebSocket 实现聊天室
查看>>
ImageOptim-无损图片压缩Mac版
查看>>
12 Go语言map底层浅析
查看>>
vue-resumer 项目中 element-ui 遇到的 textarea autosize 问题
查看>>
以主干开发作为持续交付的基础
查看>>
PHP扩展库PEAR被攻击,近半年下载者或被影响
查看>>
传统运维团队转型应该注意哪些问题?
查看>>