c#集合之一Array

     第六章类的群集,在我看来应该就是在讲集合。那么除了简单的数组类型之外,可以简要的总结一下c#中的结合类,因为c#中涉及到的集合类比较多,因此分为多篇来介绍。

 

     首先简要说明一下集合的命名空间:

     System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
     System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
     System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

 

      ArrayList,是可大小可按需动态增加的数组。ArrayList封装的是一个Object类型的Array(数组),因此,可以向ArrayList中添加任意类型的值,这和Array需要预先定义类型不一样,通是ArrayList的另一好处是不需要预先定义ArrayList的大小,可以通过Add方法向ArrayList中添加Item。因为ArrayList是Object类型,所以可以同时向ArrayList中添加不同类型的值。

      接下来了解下ArrayList的性能方面的问题,这样我们可以知道在什么时候才是一定需要使用ArrayList类的。

      1.ArrayList是Array的复杂版本,其内部封装的是Object类型的Array(数组),因此ArrayList的一些基本方法或者属性是基于Array的,例如:Index、IndexOf、Contains、Sort等。因为其内部封装的是Object类型,因此在很大程度上会涉及到拆箱和装箱的操作,因此在存储值类型是会消耗更多的资源。

      2.每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

     3.频繁的调用IndexOf、Contains等方法(Sort、BinarySearch等方法经过优化,不在此列)引起的效率损失。首先,我们要明确一点,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、 Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用 Hashtable或SortedList等键值对的集合。

 

      因为ArrayList中可以存在不同的类型的值,比如同时存储int 和string类型时,这个时候直接调用sort()方法进行排序时,会出现异常,这个时候可以通过实现Icompaere接口来解决这个问题,下面的代码简单的演示了下ArrayList的基本用法。

 

ArrayList的初始化:
1          private   void  TestArrayList()
2          {
3             Cs_ArrayList myCs  =   new  Cs_ArrayList();
4             myCs.PrintArrayList( null , true );
5             myCs.PrintArrayList( null false );
6             ICollection collections = new   object [] { " e " , 4 , " 6 " } ;
7             myCs.PrintArrayList(collections, true );
8             myCs.PrintArrayList(collections, false );
9         }

 

在排序时,是将ArrayList中的值统一转换成string类型然后进行比较。

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4
 5 using  System.Collections;
 6
 7 namespace  Practice
 8 {
 9      public   class  Cs_ArrayList
10      {
11          private  ArrayList myArrayList = null ;
12
13          // 初始化ArrayList
14          private  ArrayList InitArrayList(ICollection collections)
15          {
16              if  (collections  !=   null )
17              {
18                 myArrayList  =   new  ArrayList(collections);
19             }

20              else
21              {
22                 myArrayList  =   new  ArrayList();
23                 myArrayList.Add( " a " );
24                 myArrayList.Add( 2 );
25                 myArrayList.Add( " 6 " );
26             }

27              return  myArrayList;
28         }

29
30          public   void  PrintArrayList(ICollection collections, bool  IsSort)
31          {
32             myArrayList  =  InitArrayList(collections);
33              if  (IsSort)
34              {
35                 IComparer comparer  = new  mySort();
36                 myArrayList.Sort(comparer);
37             }

38             Console.Write( " print ArrayList's Value:/n " );
39              foreach  ( object  obj  in  myArrayList)
40              {
41                 Console.WriteLine( " {0}, " ,obj.ToString());
42             }

43             Console.ReadLine();
44         }

45
46          private   class  mySort : IComparer
47          {
48              public   int  Compare( object  x,  object  y)
49              {
50                  return   new  CaseInsensitiveComparer().Compare(x.ToString(),y.ToString());
51             }

52         }

53     }

54 }

 

 

 

 

 

      下一章了解Queue:队列,表示对象的先进先出集合。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值