使用.NET Framework中的集合






3.50/5 (16投票s)
2004年6月22日
6分钟阅读

75367

2
.NET Framework中集合的介绍。
引言
在本文中,我将介绍.NET Framework 1.1中System.Collections
和System.Collections.Specialized
命名空间中的各种类。
类
首先,简要介绍一下我将讨论的类
在System.Collections
中
ArrayList |
一个容纳对象的数组。 |
BitArray |
一个容纳位(布尔)值的数组。 |
HashTable |
一个容纳键/值对的哈希表,其组织方式基于键的哈希值。 |
队列 |
一个先进先出(first-in, first-out)的数据结构,容纳对象。 |
SortedList |
一个按键值排序的键/值对数组。 |
堆栈 |
一个先进后出(first-in, last-out)的数据结构,容纳对象。 |
在System.Collections.Specialized
中
HybridDictionary |
一种混合数据结构,如果列表很小,则使用ListDictionary ;如果列表较大,则使用HashTable 。 |
ListDictionary |
一种链表数据结构。适用于小型集合(通常低于10个元素)。 |
NameValueCollection |
一个用于字符串的键/值对集合。 |
StringCollection |
一个字符串集合。 |
StringDictionary |
一个强类型为字符串的HashTable 。 |
ArrayList
和StringCollection
类实现了IList
接口。
HashTable
、HybridDictionary
、ListDictionary
和SortedList
类实现了IDictionary
接口。
所有这些类都实现(或派生)了IEnumerable
接口,这意味着可以使用简单的foreach()
语句遍历集合。如下所示
using System.Collections;
...
ArrayList ar = new ArrayList();
ar.Add("a");
ar.Add("b");
ar.Add("c");
foreach(String s in ar)
{
Console.WriteLine(s);
}
关于foreach()
的注意事项:在foreach()
循环运行时,不允许更改集合,否则枚举器将因异常而失败。
接口
IList
IList
接口支持许多属性和方法。您可以在此处查看所有这些属性和方法
// IList Properties
bool IsFixedSize {get;}
bool IsReadOnly {get;}
object this[int index] {get; set;}
// IList Methods
int Add(object value);
void Clear();
bool Contains(object value);
int IndexOf(object value);
void Insert(int index,object value);
void Remove(object value);
void RemoveAt(int index);
- 使用
IsFixedSize
确定列表是否为固定大小。如果为true
,则表示不能添加或删除元素,但可以更改元素。 - 使用
IsReadOnly
确定列表是否为只读。如果为true
,则表示不能添加、删除或更改元素。 - 使用
this
读写列表中的元素。您实际上不写入此,而是直接在对象名称后使用[]
。如下所示ArrayList ar = new ArrayList(); ar.Add("a"); Console.WriteLine(ar[0]); // writes a
- 使用
Add()
向列表中添加元素。 - 使用
Clear()
从列表中删除所有元素。 - 使用
Contains()
查找列表中是否存在某个元素。 - 使用
IndexOf()
获取列表中元素的索引。如果不存在,IndexOf
将返回-1
。 - 使用
Insert()
在列表中的特定位置插入元素。 - 使用
Remove()
从列表中删除特定项。允许尝试删除不存在的元素,甚至是null
。 - 使用
RemoveAt()
从列表中的特定位置删除项。
IDictionary
IDictionary
接口支持许多属性和方法。您可以在此处查看所有这些属性和方法
// IDictionary Properties
bool IsFixedSize {get;}
bool IsReadOnly {get;}
object this[object key] {get; set;}
ICollection Keys {get;}
ICollection Values {get;}
// IDictionary Methods
void Add(object key,object value);
void Clear();
bool Contains(object key);
IDictionaryEnumerator GetEnumerator();
void Remove(object key);
- 使用
IsFixedSize
确定列表是否为固定大小。如果为true
,则表示不能添加或删除元素,但可以更改元素。 - 使用
IsReadOnly
确定列表是否为只读。如果为true
,则表示不能添加、删除或更改元素。 - 使用
this
读写列表中的元素。您实际上不写入此,而是直接在对象名称后使用[]
。如下所示HashTable ht = new HashTable(); ht.Add("a",null); Console.WriteLine(ht[0]); // writes a
- 使用
Add()
向列表中添加元素。 - 使用
Clear()
从列表中删除所有元素。 - 使用
Contains()
查找列表中是否存在某个元素。 - 使用
Remove()
从列表中删除特定项。允许尝试删除不存在的元素,甚至是null
。
IComparable
// IComparable Methods
int CompareTo(object obj);
CompareTo
方法应将obj
与当前实例进行比较。如果当前对象小于obj
,则返回小于零的值。如果当前对象等于obj
,则返回0。如果当前对象大于obj
,则返回大于零的值。
IComparer
// IComparer Methods
int Compare(object x,object y);
Compare
方法应比较两个对象x
和y
,如果x
小于y
,则返回小于零的值;如果x
等于y
,则返回0;如果x
大于y
,则返回大于零的值。首选的实现是使用其中一个参数的CompareTo
方法。
ArrayList
ArrayList
是基于数组的列表最常见的选择。它可以容纳任何对象类型,如果列表中的对象实现IComparable
接口,则该类可以通过调用Sort()
方法直接对元素进行排序。
ArrayList
使用起来非常简单
using System.Collections;
...
ArrayList ar = new ArrayList();
ar.Add("The");
ar.Add("quick");
ar.Add("brown");
ar.Add("fox");
ar.Add("jumped");
ar.Add("over");
ar.Add("the");
ar.Add("lazy");
ar.Add("dog");
通过索引访问元素
if(((String)ar[1]).Equals("quick"))
ar[1] = (String)"slow";
BitArray
BitArray
列表存储布尔值。它们以高效的方式存储,因为只需要一个位来存储true
或false
。
HashTable
HashTable
列表是一种键/值对类型的列表。用作列表中键的对象必须实现Object.GetHashCode()
和Object.Equals()
,因为它们用于确定值在列表中的存储位置。
HashList
中元素的可以为null。
队列
Queue
列表按照对象添加到列表中的顺序存储对象,它是一个先进先出的数据结构。
要向列表中添加对象,请调用Enqueue()
方法;要从列表中删除对象,请调用Dequeue()
方法。
您还可以通过调用Peek()
方法查看将从列表中出队的对象,而无需实际删除它。
SortedList
SortedList
列表是一种键/值对类型的列表。该列表始终保持排序状态。添加到列表中的对象必须实现IComparable
接口,或者在创建列表时必须向构造函数传递支持IComparer
接口的对象。
堆栈
Stack
列表按照对象添加到列表中的顺序存储对象,它是一个先进后出的数据结构。
要向列表中添加对象,请调用Push()
方法;要从列表中删除对象,请调用Pop()
方法。
您还可以通过调用Peek()
方法查看将从列表中弹出的对象,而无需实际删除它。
HybridDictionary
HybridDictionary
列表本质上是一个HashTable
列表,但在列表较小时,它将在内部使用效率更高的ListDictionary
列表。
阅读HashTable
的描述以了解如何使用该列表。
ListDictionary
ListDictionary
列表本质上是一个HashTable
列表。它通过链表实现,并且仅当列表中有10个或更少元素时才高效。
阅读HashTable
的描述以了解如何使用该列表。
NameValueCollection
NameStringCollection
列表是一种键/值对类型的列表。键被强类型为字符串而不是任何对象。
StringCollection
StringCollection
列表是一个强类型的ArrayList
,用于存储字符串。
StringDictionary
StringDictionary
列表是一个强类型为存储字符串的HashTable
。
阅读HashTable
的描述以了解如何使用该列表。
结论
.NET Framework有许多不同的集合类。您现在应该了解所有这些类以及每个类的特殊之处,以便您知道在下一个项目中选择哪一个。