思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET/C#中的集合类

Posted on 2010-06-02 17:40  szh114  阅读(1254)  评论(0编辑  收藏  举报

用C的时候,语言只有一个数组类型,好像没有动态数组,要用的话需要自己构造。用C++的话,可以用STL中的vector;

用C#的时候,因为数组已经是一种引用类型,每次都需要在堆上new它,所以创建运行时动态大小的数组已经成为了可能,如下:

            int n = Int32.Parse(Console.ReadLine());
            int[] ia_test = new int[n];
            Console.WriteLine(ia_test.Length);

但是这样子仅仅实现了初步的动态,也就是说大小可以在运行时指定,但是一旦指定,则无法改变,我们真正需要的是大小可以随加入而变大,随减少而变小。就跟链表一样的东西。

幸好,我们有定义于System.Collections中的集合类。在1.0时代,常用的是ArrayList,Queue,Stack。并且,System.Collections 中的大多数类型在创建对象的时候不需要指定集合中存储对象的类型,它一般可以保存任何东西,因为它们的成员原型对System.Objects进行操作。

另外,在System.Collections.Specialized命名空间中也有一些集合类,比如ListDictionary,StringCollection,StringDictionary等等。

但是这些集合类的使用存在性能问题并且缺少类型安全!to be specific,是因为其中要涉及到不必要的装箱,拆箱操作。于是在.NET2.0时代,就解决了这个问题,利用的是2.0新引入的泛型机制。

.NET肯定不会把旧有的机制给取消掉,毕竟要向前兼容。因此,引入了一个新的命名空间:System.Collections.Generic。这次,集合类的定义,就跟普通数组一样了,定义普通数组的时候,我们必须指定是什么类型的数组,并且只能存储此种类型,但是在1.0中的集合类,无法做到这个,2.0中可以啦。如:

 

List<int> MyIntList = new List<int>;

 

在System.Collections.Generic命名空间中,常用的类有:List<T>,Queue<T>,Stack<T>,Dictionary<T>等。

具体用法查手册!!!然后关于自定义泛型语法,也并不是很复杂。。。用时再看。

 

另外,关于非泛型的.NET集合类型,有一个值得注意的方法 OfType<T> , 因为非泛型的集合类不用指定集合类型,可以包含任意类型的对象,而这个方法可以用来筛选出指定的某一种类型。比如:

 

ArrayLIst myStuff = new ArrayList();

myStuff.AddRange(new object[] { 10,30,8,500,flase,"Johnny",new Car()};

IEnumerable<int> myInts = myStuff.OfType<int>();

 

这样,myInts 里面就只有筛选出来的int 类型的值。