浅谈C#中的集合对象(Collections)

开发 后端
本文将介绍微软C#编程中的集合对象(Collections),在.NET Framework里,集合有很多,如List<T>和ArrayList是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。本文将介绍的是其中的一些常用部分。

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

1.数组

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

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

classProgram
{
  staticvoidMain(string[]args)
  {
    int[]users=newint[5];
    users[0]=10;
    users[1]=20;
    //
  }
}

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

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

///
///自定义类型User,内部封装了一个属性name.
///

publicclassUser
{
  privatestringname;
  publicstringName
  {
    get{returnname;}
    set{name=value;}
  }
}

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

classProgram
{
  staticvoidMain(string[]args)
  {
    User[]user=newUser[2]; //定义User类型的数组
    Useru=newUser();
    u.Name="Beniao";
    user[0]=u;
    Console.WriteLine(user[0].Name);
  }
}

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

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

2.集合对象

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

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

(1)列表

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

classProgram
{
  staticvoidMain(string[]args)
  {
    //创建列表
    ArrayListlist=newArrayList();
    //添加元素
    list.Add("张三");
    //插入元素
    list.Insert(1,"李四");
    //访问元素
    stringname=list[0].ToString();
    //删除元素
    list.RemoveAt(1);//删除索引号为1的元素|Remove(Objectobj);
    //检索元素
    intindex=list.IndexOf("张三"); //得到对象所在的下标
    //排序元素
    list.Sort(); //有多种重载

    Listl=newList(); //创建列表
    l.Add(1);            //添加元素
    l.Add(7);
    l.Add(3);
    l.Add(9);
    l.Add(6);
    l.Add(10);
    l.Sort();
    foreach(int iinl)
    {
      Console.Write(i+"");
    }

    l.Remove(10); //删除值为10的元素
  }
}

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

(2)队列

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

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

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

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

【编辑推荐】

  1. C#3.0中自动属性和对象初始化器
  2. 简述用C#实现优先队列方法
  3. C#中的Adapter设计模式浅析
责任编辑:彭凡 来源: ITPUB
相关推荐

2009-08-18 09:06:41

C#对象和集合

2009-08-26 15:28:52

C#对象集合初始化器

2009-08-03 15:06:43

C# Stack对象C# Queue对象

2009-09-02 15:41:21

C# HTTPWebR

2009-08-12 11:24:25

C# String对象

2009-08-19 17:12:18

C# Connecti

2009-08-31 09:37:09

C# Employee

2009-09-02 16:36:37

C#调用Excel对象

2012-03-14 10:48:05

C#

2009-07-31 17:51:27

C#对象初始化

2009-07-31 13:48:34

C# eval()函数

2009-02-05 15:32:23

接口委托

2011-09-21 10:56:31

C#结构

2009-08-20 18:30:33

C# ReaderWr

2009-09-17 17:13:54

C#数组

2009-08-14 10:51:43

2009-06-24 10:49:16

JavaScript

2009-09-02 10:58:02

C#动态数组

2009-08-03 11:32:49

C#调用COM对象

2009-08-07 11:26:53

C#数组结构
点赞
收藏

51CTO技术栈公众号