C#集合类

来源:互联网 发布:手机信号稳定软件 编辑:程序博客网 时间:2024/06/08 00:10

在使用数组过程中,由于受其类型和数组大小的限制,使我们迫切需要一种大小可变、类型可变的“数组”去存储我们的数据组。那么集合便是一种不可多得的选择。下面就简单总结几种比较简单的集合的使用方法。

1System.Collections中可以直接使用的集合类有:

1)ArrayList
       
实现了接口:IListICollectionIEnumerable
        只要集合未被修改,ArrayList 就可安全地同时支持多个读取器随着向 ArrayList 中添加元素,容量通过重新分配按需自动增加(2倍增加)。如果需要建立一个对象数组,但不能预先知道数组的大小,就可以使用ArrayListArrayList把所有元素都当作object对象引用,因而在访问ArrayList的元素时要进行类型转换。

       优点:动态改变大小、灵活方便的插入和删除元素、可排序
         缺点:插入时性能不如数组、不是强类型的
2)BitArray
       
实现了接口:ICollectionIEnumerable

      管理位值的压缩数组。

3)Hashtable
       
实现了接口:IDictionaryICollectionIEnumerable
        可以向Hashtable中自由添加和删除元素,有些像ArrayList,但没有那么大的性能开销。

4)SortedList

      实现了接口:IDictionaryICollectionIEnumerable

        SortedLIst兼顾了ArrayListHashtable的优点,可按键值来排序。

5)Queue

       实现了接口:ICollectionIEnumerable

        Queque是队列,先进先出的访问各个元素可以调用Queque对象的GetEnumerator()方法,得到IEnumerator对象,来遍历队列中的各个元素。
6)Stack
       
实现了接口:ICollection
IEnumerable
        Stack
是堆栈,后进先出的访问各个元素可以调用Stack对象的GetEnumerator()方法,得到IEnumerator对象,来遍历堆栈中的各个元素

2、举例说明几种常用集合

1)ArrayList

            ArrayList list = new ArrayList();            list.Add("你好");            list.Add(new int[] { 1, 2, 3, 4, 5, 6 });            Person p = new Person();            list.Add(p);            list.Add(true);            list.AddRange(new int[] { 1, 2, 3, 4, 5, 6 });            list.AddRange(list);            for (int i = 0; i < list.Count; i++)            {                if (list[i] is int[])                {                    for (int j = 0; j < (list[i] as int[]).Length; j++)                    {                        Console.WriteLine(((int[])list[i])[j]);                    }                }                else if (list[i] is Person)                {                    ((Person)list[i]).personSayHello();                }                else if (list[i] is string)                {                    Console.WriteLine(list[i]);                }                else                    Console.WriteLine(list[i]);            }            Console.ReadKey();

运行结果:

2)Hastable 

        即键值对集合。 键值对对象[] =

        在键值对集合中,通过键去找值。注意:键值表中的键(key)必须唯一。

          <span style="font-size:12px;">Hashtable ha = new Hashtable();            ha.Add(1, "张三");            ha.Add(2, "李四");            ha.Add(false, 2);            ha.Add(3, '男');            foreach (var item in ha.Keys)            {                Console.WriteLine("键{0}的值是{1}", item, ha[item]);            }</span>
<span style="font-size:12px;">            Console.ReadKey();</span>

        运行结果:

3)List<>  泛型类

        存在于System.Collections.Generic命名空间。

       泛型集合转化为数组方法:list.toArray();

            string s = "你好,我叫张三。";            byte[] buffer02 = Encoding.Default.GetBytes(s);            File.WriteAllBytes(@"C:\Users\zhuanfeng\Desktop\new.txt", buffer02);            Console.WriteLine("写入成功");            List<int> list = new List<int>();            list.Add(1);            list.AddRange(new int[] { 2, 3, 4 });            list.AddRange(list);            foreach (int item in list)            {                Console.WriteLine(item);            }            Console.ReadKey();

        运行结果:

4)Dictionary

        和Hastable相似,只是类型唯一定义。其中的键也必须是唯一的。

Dictionary<int, string> dir = new Dictionary<int, string>();            dir.Add(1,"张三");            dir.Add(2,"李四");            dir.Add(3,"王五");            dir[1] = "赵六";            foreach (KeyValuePair<int,string> keyValue in dir)            {                Console.WriteLine("{0}---{1}",keyValue.Key,keyValue.Value);            }            Console.ReadKey();

        运行结果:

3List<T>相比ArrayList<,>相比有什么优点。

        答:(1)先解释装箱和拆箱的含义。装箱就是将值类型转换为引用类型;拆箱就是讲引用类型转换为值类型。看两种类型之间的转化是否发生装箱和拆箱操作是看两种类型之间是否存在继承关系。

                  (2)添加到 ArrayList中的任何引用或值类型都将隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。List<T>使用泛型指定了集合的类型,所以它是类型安全的,故不存在装箱和拆箱,效率更高。

0 0