65.9K
CodeProject 正在变化。 阅读更多。
Home

使用.NET Framework中的集合

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (16投票s)

2004年6月22日

6分钟阅读

viewsIcon

75367

downloadIcon

2

.NET Framework中集合的介绍。

引言

在本文中,我将介绍.NET Framework 1.1中System.CollectionsSystem.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

ArrayListStringCollection类实现了IList接口。

HashTableHybridDictionaryListDictionarySortedList类实现了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方法应比较两个对象xy,如果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列表存储布尔值。它们以高效的方式存储,因为只需要一个位来存储truefalse

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有许多不同的集合类。您现在应该了解所有这些类以及每个类的特殊之处,以便您知道在下一个项目中选择哪一个。

© . All rights reserved.