C#集合类

例一

//Dictionary
System.Collections.DictionaryEntry dic=new System.Collections.DictionaryEntry("key1","value1");

//ArrayList
System.Collections.ArrayList list=new System.Collections.ArrayList();
list.Add(1);
list.Add(2);
for(int i=0;i<list.Count;i++)
{
 System.Console.WriteLine(list[i]);
}

//HashTable
System.Collections.Hashtable table=new System.Collections.Hashtable();
table.Add("table1",1);
table.Add("table2",2);
System.Collections.IDictionaryEnumerator d=table.GetEnumerator();
while(d.MoveNext())
{
 System.Console.WriteLine(d.Entry.Key);
}

//Queue
System.Collections.Queue queue=new System.Collections.Queue();
queue.Enqueue(1);
queue.Enqueue(2);

System.Console.WriteLine(queue.Peek());
while(queue.Count>0)
{
 System.Console.WriteLine(queue.Dequeue());
}

//SortedList
System.Collections.SortedList list=new System.Collections.SortedList();
list.Add("key2",2);
list.Add("key1",1);
for(int i=0;i<list.Count;i++)
{
 System.Console.WriteLine(list.GetKey(i));
}

//Stack
System.Collections.Stack stack=new System.Collections.Stack();
stack.Push(1);
stack.Push(2);

System.Console.WriteLine(stack.Peek());
while(stack.Count>0)
{
 System.Console.WriteLine(stack.Pop());
}

例二

using System;
using System.Collections;

namespace myCon
{
 class Student
 {
  public Student(){}
  public Student(string strName)
  

  private string name;
  public string Name
  {
   get{ return name; }
  }

  public string ToString()
  {
   return name;
  }
 }

 class Connect: IEnumerable
 {
  IEnum ie = new IEnum();
  public void Add(object obj)
  {
   ie.lst.Add(obj);
  }

  public void ReMove(object obj)
  {
   ie.lst.Remove(obj);
  }

  public IEnumerator GetEnumerator()
  {
   return ie;
  }

  class IEnum: IEnumerator
  {
   public int idx = -1;
   public ArrayList lst = new ArrayList();

   public void Reset()
   {
    idx = -1;
   }

   public object Current
   {
    get
    {
     if (idx>=0 && idx<lst.Count)
      return lst[idx];
     return null;
    }
   }

   public bool MoveNext()
   {
    idx++;
    return idx<lst.Count;
   }
  }

 }
 
 
 class Class1
 {
  static void Main(string[] args)
  {
   Connect con = new Connect();
   con.Add(new Student("aaa"));
   con.Add(new Student("bbb"));
   con.Add(new Student("ccc"));
   foreach(Student stu in con)
   {
    Console.WriteLine(stu.Name);
   }
  
  }
 }
}

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>  例三

问:我是一名程序员,使用VB很久了,现在正在钻研.NET。我实在是弄不清它的集合类型:我找不到它和VB6的集合相对应的部分。.NET上有相应的集合吗?

 

答:集合类型是VB6程序员最好的朋友:它的确是把多组对象集中入一个组的唯一方法,并能提供无争辩的枚举。它使得从组内检索任意对象变得很容易。我还可以先告诉你,在.NET里没有和VB6集合相对应的部分。你现在所能拥有的其实是很多类似于VB6集合的一揽子替换方案。事实上,在你寻找.NET的集合时,你要问自己的第一个问题是,“我真的需要一个吗”?

试试如下的数组吧:

要记住,所有的.NET语言都能够创建对象类型的数组。一般而言,数组在访问速度和内存利用率上要比任何集合的效率都高,而且在许多情况使用数组就足够了。实际上,很多.NET框架的一般集合类是由Object数组支持的。

假如你有一个类:Person,在VB.NET里,你会使用以下代码创建一个包含10项内容的Person数组:

Dim Persons(10) As Person

在C#里,会是这样

Person[] persons = new Person[10];

如我所述,绝大多数情况下,数组优于集合,唯一的例外是只有当:

  • 对象数量的增加或减少无法预计时。
  • 需要存储的数据不都是同一类型时。
  • 需要对从数组加入或者检索的对象进行操作时。
所以你真的需要集合吗?

如果你已经决定了肯定要使用集合,那么你就要决定哪种集合最合适:集合、形式表或者字典。简而言之,这些集合类型可以被细分为如下几种:

  • 集合只是一组有序的对象,这些对象只能通过排序枚举来检索。到 System.Collections.ICollection接口查询集合的正式定义。
  • 形式表,相反,允许直接索引到低层的集合,它同时也支持枚举。形式表由 System.Collections.ILis接口定义。
  • 字典,就像形式表一样,既允许枚举也允许直接索引到集合,但是会存储每个对象及其相关键值,并用键值给对象进行排序。需要了解更多信息可以看 System.Collections.IDictionary

另一个最好的东西

.NET里和VB6 Collection最接近的是字典。唯一的不同是,它不像VB版本里的那样容易通过数值索引。要获得相同的功能,你需要创建一个能执行IListIDictionary的类。

 

.NET Framework为每种类型的集合提供了许多标准执行。对于任何情况你都可能会找适用的。假如需要一些帮助来区分它们并选择正确的一个,查一查《认识.Net集合》 如果找不到合适的集合,你总可以选择使用适当的接口来创建自己的集合。在VB.NET的源文件里查找由我创建的形式表WidgeList,并在Listing A看看它是如何被创建的。要注意的是在执IList的同时,WidgetList事实上也就执行了ICollection

关于WidgetList很爽的就是,执行IList的本意就是为所有的目的服务的,从集合甚至是到.NET的实时处理。它可以在任何普通形式表集合能用的地方与之互换使用,这一点与VB6里的自定义集合不同,后者与VB6 Collection的类型不兼容。


关于执行的几句话

一个接口可以看作是你的对象和其他它需要调用的对象之间的协议,这也就是说,如果你要执行一个接口的某种方法,你就必须要实现所有的方法。至少,你应该给你不用执行的任何方法标上NotSupportedException。而且,微软的文档清楚地指明在特定环境下,特定的接口方法要被标上例外。你也应该遵守这些指导方针,因为其它的程序员或许会使用到你的类里特定的例外。


使用IEnumerable来虚拟实现

无可否认的是,通过实现某一集合接口来创建集合的工作量不小。幸运的是,有个捷径。你会注意到我在Listing A中的WidgetList类不仅执行了Ilist,还同时执行了第二个接口:IEnumeratorIEnumerator定义了用于.NET中用以迭代集合的方法。更确切的说,当然你使用一个for…each结构来迭代集合时。

IEnumerator只包含三种方法:

  • Current返回的是集合中的当前项目
  • MoveNext将“当前”指针移到集合中的下一个项目。如果指针处于集合的合法位置,则返回真值;如果指针已经到了集合的末尾,则返回的是伪值。
  • Reset将“当前”指针移到集合第一个项目之前,这样 MoveNext会把第一个项目作为当前项目。

这里的把戏是任何执行IEnumberable的类可以被一个集合迭代,即使它并不执行我们先前谈及的任何集合接口。所以任何有执行功能的类都能提供类似于集合的枚举(这是使用集合的巨大优点之一),即使它并不是真正的集合。

如果说.NET集合的接口有缺点的话,那么就是加入到它们中的任何东西的类型都成了Object。这对作为程序员的你意味着:当你检索它们的时候你必须把它们恢复成原来的类型。而值的类型(例如整数型)必须被框起来(转变成参考类型)。这两点对性能的影响不大,同时这也是为什么你应该仔细考虑是否该使用数组的另一个原因,尤其是在对性能敏感的环境下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值