C#基础-集合讲解-14

B站看宝莲灯。人沉香正在那撕心裂肺地哭喊:“我要怎样才能打败我的舅舅啊?!!”
弹幕飘过一行字:你正月里剪个头。



========================手动分割线==========================

一、集合

  • 集合提供一种灵活的处理方法。
  • 与数组不同,处理的对象组可根据程序更改的需要动态地增长和收缩。
  • 对于某些集合,您可以为放入该集合的任何对象分配一个“键”,以便使用该键快速检索对象。
  • 注意:集合是类,因此必须声明新集合后,才能向该集合中添加元素。
  • 集合分类:非泛型集合和泛型集合
  • 使用非泛型集合的需引入:System.Collections命名空间。
  • 使用泛型集合需引入:System.Collections.Generic命名空间

1.1 System.Collections 命名空间下的集合类:

  1. ArrayList:表示大小根据需要动态增加的数组对象
  2. Hashtable:表示根据键的哈希代码进行组织的键/值对的集合
  3. Queue:队列,表示对象先进先出(FIFO)
  4. Stack:栈,表示对象后进先出(LIFO)

1.2 System.Collections.Generic命名空间下的集合类:

  1. Dictionary:表示根据键进行组织的键/值对的集合。
  2. List:表示课通过索引访问的对象的列表,提供用于对列表进行搜索、排序和修改的方法。
  3. Queue:表示对象的先进先出 (FIFO) 集合
  4. Stack:表示对象的后进先出 (LIFO) 集合
  5. SortedList:表示根据键进行排序的键/值对的集合,而键基于的是相关的IComparer实现
  • 创建数组,回顾之前的知识点:
  int[] arr = new int[3]{ 1, 2, 3 };
  // 遍历数组
  foreach (int temp in arr) {
      Console.WriteLine (temp);
  }
  • 数组的缺点:数组初始化以后,容量固定;数组存储的数据唯一

1.3 ArrayList的使用:

  • 实例化一个数组对象
            ArrayList arrList = new ArrayList ();

1.3.1 常用方法

  1. 给数组添加元素(可以添加重复的元素)
            arrList.Add (1);
            arrList.Add (2.3f);
            arrList.Add ("Unity妹子");
            arrList.Add (“Untiy妹子");
            arrList.Add (3);
            arrList.Add (4);
            arrList.Add (5);
            arrList.Add (6);

2.遍历数组,输出每一个元素(数组元素的类型不统一,所以最好用通用类型var修饰)

            foreach (var temp in arrList) {
                Console.WriteLine (temp);
            }
  1. 在指定索引位置插入元素(增加一个元素)
            arrList.Insert (0, “Unity老汉");
  1. 移除指定元素的第一个匹配项
            arrList.Remove (“Unity妹子");
  1. 移除指定下标的元素
            arrList.RemoveAt (1);
  1. 将整个集合元素顺序反转
            arrList.Reverse ();
  1. 从给定下标开始,反转指定个数的元素
            arrList.Reverse (3, 4);
  1. 判断是否包含指定的元素
            if (arrList.Contains (6)) {
                Console.WriteLine ("厉害了,我的哥");
            }
  1. 清除所有元素
            arrList.Clear ();
  1. 集合元素个数
            Console.WriteLine ("当前集合元素个数为:" + arrList.Count);
            foreach (var temp in arrList) {
                Console.WriteLine (temp);
            }

1.3.2 ArrayList的特点:

1.支持自动改变大小的功能。
2.可以灵活的插入元素、删除元素、访问元素。
3.不是强类型,速度跟数组比起来要慢。

1.4 Stack栈的使用:

  • 初始化对象
            Stack sta = new Stack ();

1.4.1 常用方法

  1. 入栈,将对象插入Stack的顶部
            sta.Push ("挖个坑");
            sta.Push ("埋点土");
            sta.Push ("根");
            sta.Push ("茎");
            sta.Push ("叶");
            //    sta.Push (null);//栈内可以放空对象(但null必须要写)
  1. 出栈,将移除并返回Stack顶部的对象
            Console.WriteLine (sta.Pop ());
  1. 查看,返回位于Stack顶部的对象,但不移除
            Console.WriteLine (sta.Peek ());
  1. 判断指定元素是否在栈中
            if (sta.Contains ("根")) {
                Console.WriteLine ("根还在");
            }
  1. 移除栈中所以元素
            sta.Clear ();
  1. 获取栈中元素个数
            Console.WriteLine ("当前栈中元素个数为:" + sta.Count);
            Console.WriteLine ("\n当前栈中元素为:");
            foreach (var temp in sta) {
                Console.WriteLine (temp);
            }
  1. 将栈转换成数组
            object[] objArr = sta.ToArray ();
            foreach (var temp in objArr) {
                Console.Write (temp + " ");
            }
  1. 将栈中元素拷贝到给定的数组中,需给定开始拷贝的数组索引
            object[] arr = new object[10];
            sta.CopyTo (arr, 5);
            foreach (var temp in arr) {
                Console.WriteLine (temp);
            }

1.4.2 Stack总结:

1.后进先出(LIFO)的一种数据结构。
2.随着向 Stack 中添加元素,容量通过重新分配按需自动增 加。
3.Stack 接受 null 作为有效值并且允许重复的元素。

1.5 Queue队列的使用

  • 实例化对象
            Queue que = new Queue ();

1.5.1常用方法

  1. 将对象添加到 Queue 的结尾处
            que.Enqueue ("床前明月光");
            que.Enqueue ("疑是地上霜");
            que.Enqueue ("举头望明月");
            que.Enqueue ("低头思故乡");
  1. 移除并返回位于 Queue 开始处的对象
            Console.WriteLine ("出队列的元素为:" + que.Dequeue ());
  1. 返回位于 Queue 开始处的对象但不将其移除
            Console.WriteLine ("队首元素为:" + que.Peek ());
  1. 清除队列中的所有元素
            que.Clear ();
  1. 判断队列中是否包含给定的元素
            if (que.Contains ("举头望明月")) {
                Console.WriteLine ("停车坐爱枫林晚");
            }
  1. 获取队列元素个数
            Console.WriteLine ("当前队列元素个数为:" + que.Count);
  1. 将队列中的数据转换成数组
            object[] arrQue = que.ToArray ();
            foreach (var temp in arrQue) {
                Console.Write (temp + " ");
            }
            Console.WriteLine ();
            foreach (var temp in que) {
                Console.WriteLine (temp);
            }

1.5.2 队列总结:

1.先进先出(FIFO)的一种数据结构。
2.随着向Queue 中添加元素,容量通过重新分配按需自动增加。 可通过调用 TrimToSize 来减少容量。
3.Queue 接受 null 作为有效值并且允许重复的元素。
4.在AI寻路算法中经常用的Queue。

1.6 Dictionary 字典的使用

  • 用来存储具有一一对应关系的数据的集合

  • 使用Key-Value(键值对)来存储数据

  • 字典中Key是唯一的,Value可以是变量,也可以是对象。

  • 字典是一个泛型集合,实例化的时候,必须指定Key和Value的类型

  • 实例化一个对象

            Dictionary dic = new Dictionary ();

1.6.2 常用方法

1.添加键值对

            dic.Add ("足疗技师", 98);
            dic.Add ("拔罐", 100);
            dic.Add ("踩背", 88);
            dic.Add ("大宝剑", 76);
            dic ["刮痧"] = 120;
  1. 获取指定的键相对应的值,如果有,就将Key存储到输出参数
            int aa = 0;// 定义变量,用户存储Key对应的Value
            bool have = dic.TryGetValue ("大宝剑", out aa);
            if (have) {
                Console.WriteLine ("大宝剑价格:" + aa);
            } else {
                Console.WriteLine ("大宝剑都没有,差评");
            }
  1. 清除字典中所有的键值对
            dic.Clear ();
  1. 移除指定的键值
            dic.Remove ("足疗技师");
  1. 判断字典中是否包含指定的Key
            if (dic.ContainsKey ("踩背")) {
                Console.WriteLine ("还不错");
            }
  1. 判断字典中是否包含指定的Value
            if (dic.ContainsValue (99)) {
                Console.WriteLine ("太贵了");
            }
  1. 字典中键值对的个数
            Console.WriteLine ("字典中共有{0}个键值对", dic.Count);
  1. 获取所有的Key
            Dictionary.KeyCollection keys = dic.Keys;
            foreach (var temp in keys) {
                Console.WriteLine (temp);
            }
  1. 获取所有的Value
            Dictionary.ValueCollection values = dic.Values;
            foreach (var temp in values) {
                Console.WriteLine (temp);
            }
            foreach (var temp in dic) {
                Console.WriteLine (temp.Key + " -- " + temp.Value);
            }

练习:用户输入10个姓名,可以重复输入同一个姓名,输出每个姓名,并输出每个姓名输入的多少次。

  • 思路:把姓名作为字典的Key,输入次数作为Value;每次输入判断是否已经存在该名字,如果存在就将value 加1,否则新添加
            // 初始化字典
            Dictionary names = new Dictionary ();
            // 创建循环,开始输入姓名
            string name = "0";
            int count = 0;
            while (count < 10) {
                name = Console.ReadLine ().ToString ();
                Console.WriteLine (name);
                int v;
                bool have = names.TryGetValue (name, out v);
                if (have) {
                    v++;
                    names.Remove (name);// 先将原键值对移除
                    names.Add (name, v);
                    names [name] = v;
                } else {
                    names.Add (name, 1);
                    names [name] = 1;
                }
                count++;
            }
            foreach (var temp in names) {
                Console.WriteLine (temp.Key + "输入了 " + temp.Value + "次");
            }

1.7 List

  • 初始化对象
            List list = new List ();

1.7.1 常用方法

  1. 添加元素
            list.Add (0);
            list.Add (1);
            list.Add (0);
//            list.Add ("h");
            // 添加一个数组
            int[] arr = { 9, 9, 8 };
            list.AddRange (arr);
  1. 插入元素在指定索引位置(注意,不能越界)
            list.Insert (0, 2);
  1. 删除指定元素的第一个匹配项
            list.Remove (0);
  1. 删除指定索引的元素
            list.RemoveAt (1);
  1. 移除与指定的谓词所定义的条件相匹配的所有元素(移除能够整除2的元素)
            list.RemoveAll (it => it % 2 == 0);
  1. 将整个数组元素进行反转
            list.Reverse ();
  1. 获取指定元素的下标(第一个匹配项)
            Console.WriteLine ("下标为:" + list.IndexOf (9));
  1. 使用默认比较器对数组进行排序
            list.Sort ();
  1. 判断数组中是否包含给定的元素
            Console.WriteLine (list.Contains (8));
  1. 清除所有元素
            list.Clear ();
  1. 数组元素个数
            Console.WriteLine (list.Count);
            for (int i = 0; i < list.Count; i++) {
                Console.Write (list [i] + " ");
            }

1.7.2 List总结

1.于ArrayList相比, List 类在大多数情况下执行得更好 并且是类型安全的。

  1. 若List 类的类型 T 使用引用类型,则两个类的行为是 完全相同的。 但是,如果对类型 T 使用值类型,则需要考虑 实现和装箱问题。

1.8 哈希表 -- 类似于字典,也是采用键值对的形式来管理数据

  • 实例化
            Hashtable table = new Hashtable ();
  • 添加元素
            table.Add (98, "越南新娘");
  • 哈希表中不能直接得到值,需要进行里氏转换
            string value = (string)table [98];
            Console.WriteLine ("哈希表的值是:" + value);

本次讲解就到这里,有关技术问题请小伙伴们添加QQ群:941928511,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明

你可能感兴趣的:(C#基础-集合讲解-14)