C#的6种常用集合类大比拼

导读:
   作者:清清月儿
  说明:MSDN没有说出几种集合类其间的区别,当然欲知更多细节可参考MSDN。
  一.先来说说 数组不足(也可以说 集合与数组的区别):
  1.数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的
  2.数组要声明元素的类型,集合类的元素类型却是object.
  3.数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。
  4.数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!
  
  二.下面讲述6种常用集合
  1.ArrayList类
  using System;using System.Collections.Generic;using System.Text;using System.Collections;namespace ConsoleApplication1{
  class Program
  {
  static void Main(string[] args)
  {
  ArrayList al = new ArrayList();
  al.Add(100);//单个添加 foreach (int number in new int[6] { 9, 3, 7, 2, 4, 8 })
  {
  al.Add(number);//集体添加方法一//清清月儿 http://blog.csdn.net/21aspnet/ } int[] number2 = new int[2] { 11,12 } al.AddRange(number2);//集体添加方法二 al.Remove(3);//移除值为3的 al.RemoveAt(3);//移除第3个 ArrayList al2 = new ArrayList(al.GetRange(1, 3));//新ArrayList只取旧ArrayList一部份 Console.WriteLine("遍历方法一:");
  foreach (int i in al)//不要强制转换 {
  Console.WriteLine(i);//遍历方法一 } Console.WriteLine("遍历方法二:");
  for (int i = 0 i != al2.Count; i++)//数组是length {
  int number = (int)al2[i];//一定要强制转换 Console.WriteLine(number);//遍历方法二 } } }}
  
  
  
  2.Stack类
  栈, 后进先出。push方法入栈,pop方法出栈。
  
  using System;using System.Collections.Generic;using System.Text;using System.Collections;namespace ConsoleApplication1{
  class Program
  {
  static void Main(string[] args)
  {
  Stack sk = new Stack();
  Stack sk2 = new Stack();
  foreach (int i in new int[4] { 1, 2, 3, 4 })
  {
  sk.Push(i);//填充 sk2.Push(i);
  }
  foreach (int i in sk)
  {
  Console.WriteLine(i);//遍历 } sk.Pop();
  Console.WriteLine("Pop");
  foreach (int i in sk)
  {
  Console.WriteLine(i);
  }
  sk2.Peek();//弹出最后一项不删除//清清月儿 http://blog.csdn.net/21aspnet/ Console.WriteLine("Peek");
  foreach (int i in sk2)
  {
  Console.WriteLine(i);
  } while (sk2.Count != 0)
  {
  int i = (int)sk2.Pop();//清空 sk2.Pop();//清空 } Console.WriteLine("清空");
  foreach (int i in sk2)
  {
  Console.WriteLine(i);
  } } }}
  
  
  
  3.Queue类
  队列, 先进先出。enqueue方法入队列,dequeue方法出队列。
  
  using System;using System.Collections.Generic;using System.Text;using System.Collections;namespace ConsoleApplication1{
  class Program
  {
  static void Main(string[] args)
  {
  Queue qu = new Queue();
  Queue qu2 = new Queue();
  foreach (int i in new int[4] { 1, 2, 3, 4 })
  {
  qu.Enqueue(i);//填充 qu2.Enqueue(i);
  }
  foreach (int i in qu)
  {
  Console.WriteLine(i);//遍历 } qu.Dequeue();
  Console.WriteLine("Dequeue");
  foreach (int i in qu)
  {
  Console.WriteLine(i);
  }
  qu2.Peek();//弹出最后一项不删除 Console.WriteLine("Peek");
  foreach (int i in qu2)
  {
  Console.WriteLine(i);
  } while (qu2.Count != 0)
  {
  int i = (int)qu2.Dequeue();//清空 qu2.Dequeue();//清空 } Console.WriteLine("清空");
  foreach (int i in qu2)
  {
  Console.WriteLine(i);
  } } }}
  
  
  
  4.Hashtable类
  哈希表, 名-值对。类似于字典(比数组更强大)。哈希表是经过优化的,访问下标的对象先散列过。如果以任意类型键值访问其中元素会快于其他集合。GetHashCode()方法返回一个int型数据,使用这个键的值生成该int型数据。哈希表获取这个值最后返回一个索引,表示带有给定散列的数据项在字典中存储的位置。
  
  using System;using System.Collections.Generic;using System.Text;using System.Collections;namespace ConsoleApplication1{
  class Program
  {
  public static void Main()
  {
  // Creates and initializes a new Hashtable. Hashtable myHT = new Hashtable();
  myHT.Add("one", "The");
  myHT.Add("two", "quick");
  myHT.Add("three", "brown");
  myHT.Add("four", "fox");
  // Displays the Hashtable.//清清月儿 http://blog.csdn.net/21aspnet/ Console.WriteLine("The Hashtable contains the following:");
  PrintKeysAndValues(myHT);
  } public static void PrintKeysAndValues(Hashtable myHT)
  {
  foreach (string s in myHT.Keys)
  Console.WriteLine(s);
  Console.WriteLine("-KEY- -VALUE-");
  foreach (DictionaryEntry de in myHT)
  Console.WriteLine("{0}: {1}", de.Key, de.Value);
  Console.WriteLine();
  } }}
  
  
  
  5.SortedList类
  与哈希表类似,区别在于SortedList中的Key数组排好序的。
  
  using System;using System.Collections.Generic;using System.Text;using System.Collections;namespace ConsoleApplication1{
  class Program
  {
  public static void Main()
  {
  SortedList sl = new SortedList();
  sl["c"] = 41 sl["a"] = 42 sl["d"] = 11 sl["b"] = 13 foreach (DictionaryEntry element in sl)
  {
  string s = (string)element.Key;
  int i = (int)element.Value;
  Console.WriteLine("{0},{1}",s,i);
  } } }}
  
  
  
  6.NameValueCollection类
  官方给NameValueCollection定义为特殊集合一类,在System.Collections.Specialized下。
  System.Collections.Specialized下还有HybridDicionary类,建议少于10个元素用HybridDicionary,当元素增加会自动转为HashTable。
  System.Collections.Specialized下还有HybridDicionary类,字符串集合。
  System.Collections.Specialized下还有其他类大家可以各取所需!
  言归正转主要说NameValueCollection,HashTable 和 NameValueCollection很类似但是他们还是有区别的,HashTable 的KEY是唯一性,而NameValueCollection则不唯一!
  
  using System;using System.Collections.Generic;using System.Collections;using System.Collections.Specialized;namespace ConsoleApplication1{
  class Program
  {
  static void Main(string[] args)
  {
  System.Collections.Hashtable ht = new System.Collections.Hashtable();
  ht.Add("DdpMDisplaySeq".Trim(), "Display Sequence".Trim());
  ht.Add("DdpMNameChi".Trim(), "Name (Chinese)".Trim());
  ht.Add("DdpMNameEng".Trim(), "Name (English)".Trim());
  ht.Add("Comment".Trim(), "Comment".Trim());
  ht.Add("DdpMMarketCode".Trim(), "Market Code".Trim());
  foreach (object key in ht.Keys)
  {
  Console.WriteLine("{0}/{1} {2},{3}", key, ht[key], key.GetHashCode(), ht[key].GetHashCode());
  } Console.WriteLine("");//清清月儿 http://blog.csdn.net/21aspnet/
  NameValueCollection myCol = new NameValueCollection();
  myCol.Add("DdpMDisplaySeq".Trim(), "Display Sequence".Trim());
  myCol.Add("DdpMNameChi".Trim(), "Name (Chinese)".Trim());
  myCol.Add("DdpMNameChi".Trim(), "Name (English)".Trim());
  myCol.Add("Comment".Trim(), "Comment".Trim());
  myCol.Add("DdpMMarketCode".Trim(), "Market Code".Trim());
  foreach (string key in myCol.Keys)
  {
  Console.WriteLine("{0}/{1} {2},{3}", key, myCol[key], key.GetHashCode(), myCol[key].GetHashCode());
  } } }}
  
  
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1667862
  [收藏到我的网摘] [发送Trackback] 清清月儿发表于 2007年06月27日 00:35:00
   评论
  # wsjeep 发表于2007-06-27 11:16:42 IP: 218.83.157.*
  不错
  # yxjwang 发表于2007-06-27 11:27:26 IP: 218.57.99.*
  好!!学习
  # yiwimi 发表于2007-06-27 11:44:09 IP: 60.23.141.*
  好
  # csnewbie 发表于2007-06-27 13:29:24 IP: 222.99.123.*
  第一个例子(数组)
  int number = (int)al2[i];//一定要强制转换
  为什么一定要强制转化呢?
  而 foreach里为什么又无需强制转换呢?
  # csnewbie 发表于2007-06-27 13:42:50 IP: 222.99.123.*
  Queue类 下面的那张图是错误的
  结果应该是:
  1
  2
  3
  4
  Dequeue
  2
  3
  4
  Peek
  1
  2
  3
  4
  清空
  
  2007-06-27 14:35:57作者回复:
  谢谢提醒 我上传图片时弄错了 现已经更正 谢谢!!!
  # julong88 发表于2007-06-27 13:57:37 IP: 222.85.71.*
  全用过
  # kmiaoer 发表于2007-06-27 15:26:20 IP: 60.0.132.*
  嘿嘿 支持月儿姐~~
  # kkun_3yue3 发表于2007-06-27 18:07:41 IP: 219.143.46.*
  楼主辛苦了,谢谢分享
  # stonepeter 发表于2007-06-27 22:09:35 IP: 58.31.93.*
  关于Dictionary没什么要说的?
  # ffwait 发表于2007-06-27 22:10:07 IP: 58.24.216.*
  楼主辛苦了。
  # ffwait 发表于2007-06-27 22:12:03 IP: 58.24.216.*
  很少用队列,哈希表经常用。
  # jinjiangdongfang 发表于2007-06-27 22:56:25 IP: 59.46.63.*
  真的很不错,现在很少有人能够真正的活用这些东东了.谢谢!
  # bamboo_ding 发表于2007-06-28 09:08:02 IP: 222.92.22.*
  在这学到好多东西了,顶并收藏着。。。
  # fox_sky 发表于2007-06-28 09:09:04 IP: 218.18.42.*
  楼主说集合类的元素类型却是object,此话似乎不妥,按照你这么说,List ,Stack 等都不是集合型了?他们的元素类型是T。
  # master_leo 发表于2007-06-28 09:41:28 IP: 218.25.160.*
  可开发咳嗽得发酸
  # Oceanson 发表于2007-06-28 11:13:28 IP: 210.13.84.*
  .net 2.0的范型集合才是目前的集合使用的比较多的集合处理
  Collection 对应namedCollection
  Dictionary 对应hashTable
  ...
  # Gary Gong 发表于2007-06-28 11:18:37 IP: 222.128.6.*
  感谢天,感谢地,感谢月儿照耀着大地。
  上面六个用过三个,最后一个NameValueCollection没有用过。
  建议在实例中添加GetHashCode()方法的介绍
  然后有个疑问想问问
  很菜鸟的问题
  构建Hashtable后,往myHT添加元素
  Hashtable myHT = new Hashtable();
  myHT.Add("one", "The");
  myHT.Add("two", "quick");
  myHT.Add("three", "brown");
  myHT.Add("four", "fox");
  它的key的顺序是one two three fout
  为什么贴图中,在打印集合的时候
  foreach (string s in myHT.Keys)
  Console.WriteLine(s);
  顺序变成了
  one
  three
  four
  two
  是哈希表自动变化的?怎么理解啊?谢谢。
  # ProjectDD 发表于2007-06-28 11:34:08 IP: 218.88.73.*
  一般都用泛型的集合了,NET默认给的using可以说明这点.
  # king_wgj 发表于2007-06-28 11:34:09 IP: 60.191.55.*
  不错。学习了。!
  # lnzsc 发表于2007-06-28 13:34:53 IP: 222.69.242.*
  第一个例子(数组)
  int number = (int)al2[i];//一定要强制转换
  为什么一定要强制转化呢?
  而 foreach里为什么又无需强制转换呢?
  月儿你好,你的很多大作我都拜读过,学到很多东西,所以常看你的帖子。
  这个帖子很好,我正在逐个学习,发现不需要强制转换也行的。
  我用的是c# express 2005。不知道为什么你那里需要强制转换。
  # lnzsc 发表于2007-06-28 14:16:09 IP: 222.69.242.*
  在SortedList中的代码:
  string s = (string)element.Key;
  int i = (int)element.Value;
  是可以省略的,我的代码是:
  Console.WriteLine("{0},{1}", element.Key, element.Value);
  不过还是非常感谢月儿。
  # weiky626 发表于2007-06-28 14:52:03 IP: 218.18.36.*
  充其量是每个集合类举了个例子怎么用,没看到哪个地方有“大比拼”影子,还以为楼主会分析各个集合类的有略呢!楼主的题目有待斟酌
  # xbt746 发表于2007-06-28 16:59:32 IP: 58.19.119.*
  呵呵,学习一下
  # DreamNoYetBecomeTrue 发表于2007-06-28 17:54:00 IP: 121.227.87.*
  刚刚接触C#学习中
  谢谢LZ
  # ericfine 发表于2007-06-29 10:17:22 IP: 205.243.112.*
  比了半天没比出优伪来呀 =_= 月儿MM加油
  # woaivs 发表于2007-06-29 10:21:09 IP: 218.106.184.*
  是女的?很强啊。
  # 节能 发表于2007-06-29 12:30:27 IP: 222.212.66.*
  很无聊
  # cnlcg 发表于2007-06-29 18:07:21 IP: 220.207.140.*
  哎,现在对。net的类库还不了解
  # cnlcg 发表于2007-06-29 18:18:58 IP: 220.202.74.*
  哎,现在对。net的类库还不了解
  # xingzhiyun 发表于2007-06-30 23:22:41 IP: 221.204.88.*
  都试了,记了笔记,谢谢
  # gcgc1225 发表于2007-07-01 18:46:14 IP: 219.141.1.*
  学习学习
  # netlangzi 发表于2007-07-03 16:57:36 IP: 220.164.63.*
  谢谢哦.
  清清月儿是女的吗?
  # zhrun 发表于2007-07-08 00:02:00 IP: 222.211.220.*
  我是常客  学习
  # winnerzone 发表于2007-07-11 14:48:14 IP: 219.238.215.*
  不知道List算不算一个.
  # wangwang008 发表于2007-08-07 08:17:16 IP: 218.25.25.*
  学习中。谢谢!我想问一下,你那些代码是放在什么东西里面贴出来的。
  # lgg06 发表于2007-08-17 11:38:25 IP: 218.83.157.*
  >>数组要声明元素的类型,集合类的元素类型却是object.
  kao,什么人啊. 按你的意思把范型费了算了,退一万步,,你自个用object[] 拉倒
  大名
  网址
  校验码:
  评论
  
  
  当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
  

本文转自
http://blog.csdn.net/21aspnet/archive/2007/06/27/1667862.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值