C#编程利器之五:集合对象(Collections)

     C#里面的集合对象,是一个很重要的知识点.可以说没有人编程不使用集合.这里我不打算过多的去介绍理论相关的知识,下面和大家分享和学习一下在平时开发中的常用集合对象,以及他们之间的关系.

 

     记得教科书上有这样一句话:"如果需要使用同一类型的多个对象,就可以使用集合和数组。" ,是的,没有错.只是数组的大小是固定的。如果元素个数是动态的,就应使用集合类。在.NET Framework里,集合有很多,如List<T>和ArrayList是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。本文不会对这些集合对象作详细的介绍,只是把常用的集合对象拿出来讨论一下。

 

一、数组

     在实际应用中,数组又可分为:简单数组、多维数组、锯齿数组、Array数组.使用最多的应该算的简单数组和多维数组,这里我以简单数组为例简单介绍下数组的简单使用,关于的其他知识点请大家参考相关资料和书籍.

     比如说我们要定义一个整型的简单数组,那应该怎么定义呢?

 1  class  Program
 2  {
 3       static   void  Main( string [] args)
 4      {
 5           int [] users  =   new   int [ 5 ];
 6          users[ 0 =   10 ;
 7          users[ 1 =   20 ;
 8           //
 9      }
10  }

 

     是上面这样定义和使用的吗?我想稍微学过编程的朋友都可以给出肯定的答案.关于这点我不想作过多的解释.见下图:
                                

 

      这里我们是使用的基本类型(int)类型来定义的数组,在使用开发中我们还会使用到自定义类型数组,下面我就简单的说说这方面的知识.要定义自定义类型数组,那么首先就应该有个自定义类型,当然这个类型可以封其他的相关属性.OK,如下代码段:

 1  ///   <summary>
 2  ///  自定义类型User,内部封装了一个属性name.
 3  ///   </summary>
 4  public   class  User
 5  {
 6       private   string  name;
 7       public   string  Name
 8      {
 9           get  {  return  name; }
10           set  { name  =  value; }
11      }
12  }

 

     如上就是一个自定义的类型,我们在其内部封装了一个name属性.那么,类型已经定义好,那我们应该如何去使用这个自定义类型去定义一个数组呢?是这样的吗?

 1  class  Program
 2  {
 3       static   void  Main( string [] args)
 4      {
 5          User[] user  =   new  User[ 2 ]; //定义User类型的数组
 6          User u  =   new  User();
 7          u.Name = " Beniao " ;
 8          user[ 0 =  u;
 9          Console.WriteLine(user[ 0 ].Name);
10      }
11  }

 

     如上我们就完成了一个自定义类型的对象数组的定义,以及数组的相关操作.见下图:

                

     由于多维数组、锯齿数组、Array数组等数组在实际的开发中使用不是很多,这里就不作介绍.

 

二、集合对象

     集合类可以组合为集合,存储Object类型的元素和泛型集合类。在.NET 2.0之前,不存在泛型。现在泛型集合类通常是集合的首选类型。泛型集合类是类型安全的,如果使用值类型,是不需要装箱操作的。如果要在集合中添加不同类型的对象,且这些对象不是相互派生的,例如在集合中添加int和string对象,就只需基于对象的集合类。

 

     象类型的集合位于System.Collections命名空间;泛型集合类位于System.Collections. Generic命名空间;当然,组合集合类还有其他方式。集合可以根据集合类执行的接口组合为列表、集合和字典。接口及其功能如表10-1所示。.NET 2.0为集合类添加了新的泛型接口,例如IEnumerable<T>和IList<T>。这些接口的非泛型版本将一个对象定义为方法的参数,而其泛型版本使用泛型类型T。

 

     1. 列表

     .NET Framework为动态列表提供了类ArrayList和List<T>。System.Collections.Generic命名空间中的类List<T>的用法非常类似于System.Collections命名空间中的ArrayList类。这个类实现了IList、ICollection和IEnumerable接口。如下代码段:

 1  class  Program
 2  {
 3       static   void  Main( string [] args)
 4      {
 5           // 创建列表
 6          ArrayList list  =   new  ArrayList();
 7           // 添加元素
 8          list.Add( " 张三 " );
 9           // 插入元素
10          list.Insert( 1 " 李四 " );
11           // 访问元素
12           string  name  =  list[ 0 ].ToString();
13           // 删除元素
14          list.RemoveAt( 1 );  // 删除索引号为1的元素 | Remove(Object obj);
15           // 检索元素
16           int  index  =  list.IndexOf( " 张三 " );   // 得到对象所在的下标
17           // 排序元素
18          list.Sort();   // 有多种重载
19 
20          List < int >  l  =   new  List < int > ();    // 创建列表
21          l.Add( 1 );                         // 添加元素
22          l.Add( 7 );
23          l.Add( 3 );
24          l.Add( 9 );
25          l.Add( 6 );
26          l.Add( 10 );
27          l.Sort();
28           foreach  ( int   i  in  l)
29          {
30              Console.Write(i + "   " );
31          }
32 
33          l.Remove( 10 );   // 删除值为10的元素
34      }
35  }

 

     关于列表的算法可以参考我以前写过的一篇文章,文章连接:列表算法 

 

     2. 队列

     队列是其元素以先进先出(FIFO)的方式来处理的集合。先放在队列中的元素会先读取。可结合下图来理解:

                     

     在.NET的System.Collections命名空间中有非泛型类Queue,在System.Collections. Generic命名空间中有泛型类Queue<T>。这两个类的功能非常类似,但泛型类是强类型化的,定义了类型T,而非泛型类基于Object类型。

     在创建队列时,可以使用与List<T>类型类似的构造函数。默认的构造函数会创建一个空队列,也可以使用构造函数指定容量。在把元素添加到队列中时,容量会递增,包含4、8、16和32个元素。与List<T>类型类似,队列的容量也总是根据需要成倍增加。非泛型类Queue的默认构造函数与此不同,它会创建一个包含32项的空数组。

 

     不过一般项目中用得不是很多,这里故不做示例代码.

 

     3.链表

      链表算发其实也很简单,因为项目开发中使用频率不高,所以这里就不做详细介绍.可参考以前我写的关于链表算法的一篇文章,文章连接: 单链表 

 

     关于结合对象我就简单的介绍这些,另外还有如栈,字典等集合对象,在某些时候也会用到,详细大家可以查阅相关书籍和资料.

     这里我推荐一本书,大家有兴趣的可以看看《C# 2005 & .NET 3.0高级编程(第5版) 》。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值