黑马程序员--数组和集合

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
数组是一组具有相同类型和名称的变量的集合,如一组整数、一组字符等;组成数组的这些变量称为数组的元素;
一组数组的定义中包含以下几个要素:
1)元素类型  2)数组的维数 3)每个维数的上、下限
数组类型从类型System.Array继承而来
数组的定义:<Type>[ ] <name>
代码:
            int[] anIntArray = new int[5] { 14, 25, 36, 19, 13 };
            //遍历输出
            foreach (int i in anIntArray)
            {
                Console.WriteLine("遍历输出结果:{0}", i);
            }
            //数组元素的清空只需将部分元素设置为0、false或空 Array.Clear()方法
            //Array.Clear(anIntArray, 1, 3);//返回值是空
            //foreach (int i2 in anIntArray)
            //{
            //    Console.WriteLine("清空后的数组:{0}", i2);
            //}
            int weizhi=Array.IndexOf(anIntArray, 36);
            Console.WriteLine("36的位置:{0}", weizhi);
            //数组排序Array.Sort和
            //Array.Sort(anIntArray);
            //foreach (int i3 in anIntArray)
            //{
            //    Console.WriteLine("排序Sort:{0}",i3);//由小到大的排序
            //}
            //排序反转输出Array.Reverse
            Array.Reverse(anIntArray);
            foreach (int i4 in anIntArray)
            {
                Console.WriteLine("反转输出:{0}", i4);
            }
            Console.ReadKey();

集合是一种类似数组的容器,可以支持比数组更加灵活的数据操纵;数组的大小是固定的;如果元素的个数是动态的,就应该使用集合
通常将数组(Array)和集合的概念分开,认为集合包含ArrayList、哈希表Hashtable、队列Queue等
1)ArrayList类
代码:
            ArrayList al = new ArrayList();
            al.Add("czsas");
            al.Add("二十");
            al.Add("什么都可以");
            for (int i = 0; i < al.Count; i++)
            {
                Console.WriteLine(al[i]);
            }
            Console.WriteLine(al.Capacity);
            Console.WriteLine(al.Contains("二十"));  //检查某个元素是否在里面
            //al.Clear(); //是移除所有的元素
            al.RemoveAt(1);
            //al.Remove(20); 这两个移除的区别是前者靠索引移除某个元素,而后者是直接输入移除的东西
            for (int i = 0; i < al.Count; i++)
            {
                Console.WriteLine(al[i]);
            }
            string[] str=new string[5];
            al.CopyTo(str);
            foreach (string str1 in str)
            {
                Console.WriteLine(str1);
            }
            Console.ReadKey();

2)Hashtable类(哈希表) 是表示键值对的集合,键值能够根据键的散列代码进行组织
代码:
            Hashtable ha = new Hashtable();
            ha.Add("key1", 1);  //向组合添加元素
            ha.Add("key2", 2);
            ha.Add("星期一", 1);
            ha.Add("星期二", 2);
            ha["星期三"] = 3;
            IEnumerator En = ha.GetEnumerator();
            while (En.MoveNext())
            {
                DictionaryEntry de = (DictionaryEntry)En.Current;  //定义设置或检索键值对
                Console.WriteLine("{0}:{1}",de.Key,de.Value);
            }
            Console.ReadKey();

3)SortedList(有序表)是表示键值对的集合,通过这些键的值进行排序;由于要排序所以比Hashtable要慢
代码:
            SortedList sl = new SortedList();
            sl.Add("aa", 122);  //向组合添加元素
            sl.Add("bb", 22);
            sl.Add("cc", 31);
            sl.Add("dd", 42);
            for (int i = 0; i < sl.Count; i++)
            {
                Console.WriteLine("{0}:{1}",sl.GetKey(i),sl.GetByIndex(i));
            }
            SortedList sl1 = new SortedList();
            sl1.Add(1, "aa");
            sl1.Add(5, "cd");
            sl1.Add(3, "bb");
            sl1.Add(2, "cc");
            sl1.Add(4, "de");
            for (int i = 0; i < sl1.Count; i++)
            {
                Console.WriteLine("{0}:{1}", sl1.GetKey(i), sl1.GetByIndex(i)); //GetKey获取索引处的键  GetByIndex获取索引处的值
            }
            Console.ReadKey();

4)Queue类表示对象先进先出的集合(从一端插入而从另一端移出) 通常用于按接收顺序存储信息
代码:
            Queue qu = new Queue();
            qu.Enqueue("队列1");  //该方法是将对象添加到队列的尾端
            qu.Enqueue("队列2");
            qu.Enqueue(3);
            qu.Dequeue();//移除并返回位于 Queue 开始处的对象。
            //列举器的功能是读取集合的数据,即循环访问集合的对象。一个列举器只能与一个集合,但一个集合可以有多个列举器。
            IEnumerator En = qu.GetEnumerator();
            while (En.MoveNext())//推进到集合的下一个元素
            {


                Console.WriteLine(En.Current);//获取集合的当前元素 
            }
            Console.WriteLine(qu.Peek()); //读取头部一个元素,但不删除
            Console.ReadKey();

5)Stack是表示对象后进后出的集合,通常用于接收的反转顺序存储信息; 栈的修改原则是按照后进后出的原则进行,每次删除(退栈)的总是”最新“的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才删除 。
代码:
            Stack sk = new Stack();
            sk.Push("栈1");
            sk.Push(12);
            sk.Push("obj1");
            sk.Push("cdasd");  //最后插入的元素
            IEnumerator en = sk.GetEnumerator();
            while (en.MoveNext())
            {
                Console.WriteLine("移除顶部前:{0}",en.Current);
            } //输出顺序结果:cdasd-obj1-12-栈1  (先进后出,后进先出)
            Console.WriteLine("\n");
            sk.Pop(); //移除顶部的对象
            IEnumerator en1 = sk.GetEnumerator();
            while (en1.MoveNext())
            {
                Console.WriteLine("移除顶部后:{0}",en1.Current);
            }//结果:obj1-12-栈1
            Console.ReadKey();

6)LinkedList<T>是一个双向链表数据结构;链表不但可以存储元素,还可以存储其前一个和后一个的引用信息,
       同时,使用LinkedList,可以快速实现袁术的插入和删除操作,只需要修改Next和Previous的引用
代码:
            string[] str = new string[] { "字符串1", "casa", "链表1", "sdcd", "链表lianbiao" };
            LinkedList<string> ll = new LinkedList<string>(str);
            IEnumerator<string> en = ll.GetEnumerator();
            while (en.MoveNext())
            {
                Console.WriteLine(en.Current);
            }
            Console.WriteLine("\n");
            //向某个节点的前后添加元素
            LinkedListNode<string> lln = ll.Find("链表1");  /*从链表的开头开始搜索传送给它的元素,并返回一个LinkedListNode<T> 
                                                                                                   而FindLast与它类似,只是从结尾开始搜索 */
            ll.AddBefore(lln, "链表1前添加");
            ll.AddAfter(lln, "链表1后添加");
            IEnumerator<string> en1 = ll.GetEnumerator();
            while (en1.MoveNext())
            {
                Console.WriteLine(en1.Current);
            }
            Console.WriteLine("\n");
            //向链表添加开始和最后位置添加元素
            ll.AddFirst("链表第一个");
            ll.AddLast("链表最后一个");
            IEnumerator<string> en2 = ll.GetEnumerator();
            while (en2.MoveNext())
            {
                Console.WriteLine(en2.Current);
            }
            Console.ReadKey();

7)List<T>表示可通过索引访问的对象的强类型列表
代码:
            List<string> lt = new List<string>();
            lt.Add("列表元素1");
            lt.Add("列表元素2");
            lt.Add("cascavasd");
            lt.Add("adsdasdaxaxdadx");
            Console.WriteLine("排序前输出:");
            for (int i = 0; i < lt.Count; i++)
            {
                Console.WriteLine(lt[i]);
            }
            Console.WriteLine("列表元素2位置:{0}", lt.IndexOf("列表元素2")); //IndexOf方法是搜索列表的位置
            lt.Sort();  //排序
            Console.WriteLine("\n");
            Console.WriteLine("排序后输出:");
            for (int i = 0; i < lt.Count; i++)
            {
                Console.WriteLine(lt[i]);
            }
            /*BinarySearch方法  如果找到 item,则为已排序的 List<(Of <(T>)>) 中 item 的从零开始的索引;
             否则为一个负数,该负数是大于 item 的第一个元素的索引的按位求补。如果没有更大的元素,则为 Count 的按位求补 */
            Console.WriteLine("寻找列表元素2的位置为:{0}", lt.BinarySearch("列表元素2")); //搜索元素的位置,从0开始索引
            Console.ReadKey();

8)位数组BitArray可以以数组的方式处理许多位
      BitArray类实现一个位结构,它表示一个二进制位(1和0)的集合.这些1和0表示Boolean值,其中二进制1表示true,二进制0表示false.
代码:
            BitArray ba1 = new BitArray(4);
            BitArray ba2 = new BitArray(4);
            ba1[0] = ba1[2] = false;
            ba1[1] = ba1[3] = true;
            ba2[0] = ba2[1] = true;
            ba2[2] = ba2[3] = false;
            IEnumerator en1 = ba1.GetEnumerator();  //列举器1
            Console.WriteLine("ba1数组位执行前:");
            while (en1.MoveNext())
            {
                Console.Write("{0}",en1.Current);  //输出位数组ba1的位结果
            }
            Console.WriteLine("\n");
            IEnumerator en2 = ba2.GetEnumerator(); //列举器2
            Console.WriteLine("ba2数组位执行前:");
            while (en2.MoveNext())
            {
                Console.Write("{0}", en2.Current);  //输出位数组ba1的位结果
            }
            Console.WriteLine("\n");
            //如果两个操作数均为 true,则按位 AND 运算返回 true;如果一个或两个操作数为 false,则按位 AND 运算返回 false
            #region 其他运算:
            /*还有其他运算如  Or方法:如果一个或两个操作数为 true,则按位“或”运算返回 true;如果两个操作数都为 false,
                                      则按位“或”运算返回 false
                             Xor方法:如果恰好只有一个操作数为 true,则按位“异或”运算返回 true;如果两个操作数的布尔值相同,
                                      则按位“异或”运算返回 false     */
            #endregion
            BitArray ba3 = ba1.And(ba2);
            IEnumerator en3 = ba3.GetEnumerator();  //列举器3
            Console.WriteLine("ba1和ba2数组位按照and运算执行:");
            while (en3.MoveNext())
            {
                Console.Write("{0}", en3.Current);
            }
            Console.ReadKey();


---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值