首页 > 开发 > 综合 > 正文

C#中的集合类

2024-07-21 02:26:25
字体:
来源:转载
供稿:网友

集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)
一个集合包括多个元素,即有一个集合类对象和n个元素对象

---------------------------

因为任何集合类都实现了ienumerable接口,所以任何集合类对象都有一个getenumerator()方法,该方法可以返回一个实现了ienumerator接口的对象,这个返回的ienumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象

如果集合类是用户自定义的集合类,则用户必须实现它的getenumerator()方法,否则不能使用循环。当然,与这个自定义集合类对应的ienumerator类(实现了该接口的类),也要自定义一个才行

比如,arraylist集合类对应的ienumerator是 arraylistenumeratorsimple
            array集合类对应的ienumerator是 szarrayenumerator
      (这两个类在.net framework类库文档(msdn)中都没有介绍)

------------------------

1.system.colloctions中表示集合的行为的接口有:
1)icollection
定义所有集合的大小、枚举数和同步方法。派生于ienumerable
它定义了集合类最基本的行为,所有的集合类都实现了这个接口(基接口)
但是它的行为太过基本:主要就是一个count属性,单独实现它没有太大意义

2)ienumerable
公开枚举数,该枚举数支持在集合上进行简单迭代
它只有一个方法 getenumerator(),该方法可以返回一个ienumerator接口,通过它可以遍历集合
基本上所有的集合类都实现了这个接口

3)ilist
ilist实现是可排序且可按照索引访问其成员的值的集合,它本身实现了icollection和ienumerable接口
是所有列表的抽象基类。ilist 实现有三种类别:只读、固定大小、可变大小。

4)idictionary
idictionary实现是键/值对的集合,它本身实现了icollection和ienumerable接口
是键/值对的集合的基接口。idictionary 实现有三种类别:只读、固定大小、可变大小。
idictionary可称为字典、映射或散列表,它根据键(任意类型)来访问值

------------------------------

2.system.collections中可以直接使用的集合类有:
1)arraylist
实现了接口:ilist、icollection、ienumerable
只要集合未被修改,arraylist 就可安全地同时支持多个读取器
随着向 arraylist 中添加元素,容量通过重新分配按需自动增加(2倍增加)
如果需要建立一个对象数组,但不能预先知道数组的大小,就可以使用arraylist
arraylist把所有元素都当作object对象引用,因而在访问arraylist的元素时要进行类型转换
优点:动态改变大小、灵活方便的插入和删除元素、可排序
缺点:插入时性能不如数组、不是强类型的

2)bitarray
实现了接口:icollection、ienumerable
管理位值的压缩数组。

3)hashtable
实现了接口:idictionary、icollection、ienumerable
可以向hashtable中自由添加和删除元素,有些像arraylist,但没有那么大的性能开销

4)sortedlist
实现了接口:idictionary、icollection、ienumerable
sortedlist兼顾了arraylist和hashtable的优点,可按键值来排序

5)queue
实现了接口:icollection、ienumerable
queque是队列,先进先出的访问各个元素
可以调用queque对象的getenumerator()方法,得到ienumerator对象,来遍历队列中的各个元素

6)stack
实现了接口:icollection、ienumerable
stack是堆栈,后进先出的访问各个元素
可以调用stack对象的getenumerator()方法,得到ienumerator对象,来遍历堆栈中的各个元素

----------------

3.上面提到的几种集合类,他们都是通用的集合类,他们所接受的元素大都是object类型,当对象放入
了集合之后,都失去了原有的类型信息-即这些通用集合类都不是强类型的
解决办法是使用强类型的集合类
system.collections命名空间下的collectionbase,dictionarybase,readonlycollectionbase 类
system.collections.specialized命名空间下的一些类可以满足要求,可以直接使用也可以继承

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表