zoukankan      html  css  js  c++  java
  • 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版) 》。

  • 相关阅读:
    CodeForces 19D Points (线段树+set)
    FZU 2105 Digits Count
    HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
    HDU 5634 Rikka with Phi (线段树)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
  • 原文地址:https://www.cnblogs.com/beniao/p/1249034.html
Copyright © 2011-2022 走看看