net中的集合

本文介绍了.NET框架中的各种集合类,包括队列、堆栈、哈希表等,并提供了使用示例。文章还指导如何根据需求选择合适的集合类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合提供了一种将任意对象格式化存储的方法,我们都知道在日常的程序设计中,它们是多么有帮助。
.NET类库提供了一系列令人困惑的集合 对象,而每种对象又有专门的用途,看上去这似乎阻碍了我们利用这些“财富”,其实,更多的选择意味着更加灵活,但同时也意味着更加复杂。因此,它应当引起 你的关注,你应对在何种情况下使用那种类型的集合有充分的理解,随我一起来了解如何使用.NET的集合。
  
.NET集合的定义

集合是一组组合在一起的类似的类型化对象。

System.Collections 类通常可以分为三种类型:

常用集合。
   这些集合是数据集合的常见变体,如哈希表、队列、堆栈、字典和列表。常用集合有泛型和非泛型之分。

位集合。
   这些集合中的元素均为位标志。它们的行为与其他集合稍有不同。

专用集合。
  这些集合都具有专门的用途,通常用于处理特定的元素类型,如 StringDictionary。

          集合基于 ICollection 接口、IList 接口、IDictionary 接口,或其泛型集合中的相应接口。IList 接口和 IDictionary 接口都是从 ICollection 接口派生的;因此,所有集合都直接或间接基于 ICollection 接口。在基于 IList 接口的集合中(如 Array、ArrayList 或 List)或直接基于 ICollection 接口的集合中(如 Queue、Stack 或 LinkedList),每个元素都只包含一个值。在基于 IDictionary 接口的集合中(如 Hashtable 和 SortedList 类,或者 Dictionary 和 SortedList 泛型类),每个元素都包含一个键和一个值。KeyedCollection 类较为特别,因为它是带有嵌入键的值列表,因此它的行为既像列表又像字典。

          Hashtable 或 Dictionary 中的元素只能通过元素的键访问;而 SortedList 或 KeyedCollection 中的元素既可以通过元素的键访问,也可以通过元素的索引访问。所有集合中的索引都从零开始,不过 Array 除外,它允许使用索引不从零开始的数组。KeyedCollection 中的元素既可以通过元素的键访问,也可以通过元素的索引访问。所有集合中的索引都从零开始,不过 Array 除外,它允许使用索引不从零开始的数组。根据存储元素的方式、对元素进行排序的方式、执行搜索的方式以及进行比较的方式的不同,集合可能也有所不同。 Queue 类和 Queue 泛型类提供先进先出列表,而 Stack 类和 Stack 泛型 类提供后进先出列表。SortedList 类和 SortedList 泛型类提供 Hashtable 类和 Dictionary 泛型类的排序的版本。


使用示例

        SortedList SL = new SortedList();
        SL.Add("aa", "aa");
        SL.Add("bb", "bb");
        SL.Add("ab", "ab");
        SL.Add("cc", "cc");
        //Response.Write(SL.GetByIndex(2));     //默认排序.
        SL.GetKey(0);                           //通过索引获值.
       
        ArrayList al = new ArrayList();
        al.Add("aa");
        al.Add("bb");
        al.Add("ab");
        //al.Sort();    默认不排序   
       // Response.Write(al[1].ToString());  
    
        Hashtable hash = new Hashtable();
        hash.Add("aa", "aa");
        hash.Add("bb","bb");
        hash.Add("ab", "ab");

        Queue qu = new Queue();     //队列
        qu.Enqueue("aa");
        qu.Peek();
       // Response.Write(qu.Count);
        qu.Dequeue();

        Stack st = new Stack();     //栈
        st.Push("aa");
        st.Peek();
       // Response.Write(st.Count);
        st.Pop();
        string[] words ={ "the", "fox", "jumped", "over", "the", "dog" };
        LinkedList<string> LL = new LinkedList<string>(words);
        //Response.Write(LL.First.Value);
        //Response.Write(LL.Find("fox").Value);
        LL.AddFirst("aa");
        LL.AddAfter(LL.AddFirst("aa"), "ab");
        LL.AddAfter(LL.AddFirst("ab"), "bc");
        //Response.Write(LL.Count);

        NameValueCollection NVC = new NameValueCollection();
        NVC.Add("aa", "aa");
        NVC.Add("aa", "a1");
        NVC.Add("bb","bb");
        //Response.Write(NVC["aa"].ToString());
        //Response.Write(NVC.Keys[1].ToString());

选择集合类 


您是否需要一个序列列表,其中的元素通常在检索其值后被放弃?

如果需要,那么在需要先进先出 (FIFO) 行为时请考虑使用 Queue 类或 Queue 泛型类。在需要后进先出 (LIFO) 行为时请考虑使用 Stack 类或 Stack 泛型类。如果不需要,请考虑使用其他集合。

是否需要以某种顺序访问元素,例如 FIFO、LIFO 或随机访问?

Queue 类和 Queue 泛型类提供 FIFO 访问。Stack 类和 Stack 泛型类提供 LIFO 访问。LinkedList 泛型类允许从开头到末尾或从末尾到开头按顺序访问。其余的集合提供随机访问。

是否需要通过索引访问每一元素?

ArrayList 和 StringCollection 类以及 List 泛型类通过元素的从零开始的索引提供对元素的访问。 Hashtable、SortedList、ListDictionary 和 StringDictionary 类以及 Dictionary 和 SortedDictionary 泛型类通过元素的键提供对元素的访问。NameObjectCollectionBase 和 NameValueCollection 类以及 KeyedCollection 和 SortedList 泛型类通过其元素的从零开始的索引或者通过其元素的键提供对元素的访问。

每一元素将包含一个值、一个键和一个值的组合还是一个键和多个值的组合?

一个值:使用任何基于 IList 接口或 IList 泛型接口的集合。

一个键和一个值:使用任何基于 IDictionary 接口或 IDictionary 泛型接口的集合。

带有嵌入的键的一个值:使用 KeyedCollection 泛型类。

一个键和多个值:使用 NameValueCollection 类。

是否需要用与输入元素方式不同的方式对元素排序?

Hashtable 类按其元素的哈希代码对元素排序。

SortedList 类以及 SortedDictionary 和 SortedList 泛型类根据 IComparer 接口和 IComparer 泛型接口的实现按键对元素排序。

ArrayList 提供 Sort 方法,该方法接受 IComparer 实现作为参数。其对应的泛型类(List 泛型类)提供 Sort 方法,该方法接受

IComparer 泛型接口的实现作为参数。

是否需要信息的快速搜索和检索?

对于小集合(10 项或更少),ListDictionary 比 Hashtable 快。SortedDictionary 泛型类提供比 Dictionary 泛型类更快的查找。

是否需要只接受字符串的集合?

StringCollection(基于 IList)和 StringDictionary(基于 IDictionary)都位于 System.Collections.Specialized 命名空间中。

此外,通过为泛型类型参数指定 String 类,可以使用 System.Collections.Generic 命名空间中的任何泛型集合类作为强类型字符串集合

名称索引访问键值 排序 备注
ArrayList ×Sort方法可实现排序
Queue××先进先出
Stack××后进先出
Hashtable×键值×--
SortedList键值索引访问通过GetByIndex(ID)
ListDictionary×键值×元素数量不大于10时更快
NameValueCollection 一键多值×--
OrderedDictionary键值--
StringCollection×字符串集合
StringDictionary×键值×将键和值强类型化为字符串
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值