2022.11.13《VR引擎程序设计基础》—第9章 数组和集合 学习总结

101 阅读3分钟

1、数组

由于数组是一个引用类型,故在使用的时候,需要使用new关键字创建数组实例。

1.1、声明数组

格式: 数据类型[] 数组名;

特别注意:

①命名规则及其初始化方式上:

二维数组的命名是不一样的,以下是二维数组的命名示例:

②数组遍历的模式上:

不是int[][] 而是[,] 且初始化赋值的时候也要注意写法,这点和一维数组有所不同,但就其本质上来讲是一样的。

  int[,] arr2 = new int[2,2] { { 2, 2 },{ 5, 5 } };
    foreach (int i in arr2)
    {
        Console.WriteLine(i);
    }

关于数组的遍历都是一样的,两种方式均可!

1.2、初始化数组

格式: 数据类型[] 数组名 = new int[10];

2、访问数组的两种形式

1.1、使用for循环 1.2、使用foreah语句

具体用法示例:

    int[] arr2 = new int[] { 2,2,3,4,5 };
    foreach (int i in arr1)
    {
    Console.WriteLine(i);
    }
    //输出结果:
    2
    2
    3
    4
    5

3、集合

3.1 数组

  • 普通数组的优缺点:

①优点: 连续存储,索引速度快,元素的赋值和修改非常的方便 ②缺点: 数据的插入麻烦,声明数组的时候,无法预知数组的长度,可能会声明数组的长度过大,造成资源浪费。

综合上述普通数组的缺点,故引入了动态数组。

  • 动态数组(ArrayList)

关于动态数组的用法如下:

ArrayList list1 = new ArrayList();
    //增加数据
    list1.Add("123");//是Add不是add,写成小写的a就会报错,这点要注意!
    list1.Add("haha");
    //修改数据
    list1[2] = 34;
    //删除数据
    list1.RemoveAt(0);//是RemoveAt,不是Remove
    //插入数据
    list1.Insert(0,"qwe");
    小结:使用ArrayList类时,一定要进行引用,即在代码头部加入
    using System.Collections;
    其次,要注意一些大小写的问题
    
  • 由于ArrayList 存在不安全类型与装箱、拆箱的缺点,这里又引入泛型。

用法与ArrayList类似,但是泛型需要为集合内的元素声明对象类型,具体用法如下:

    List<string> list = new List<string>();
    //新增数据
    list.Add("ABC");
    //修改数据
    list[0] = "abc";
    //删除数据
    list.RemoveAt(0);
    foreach (string i in list) {
        Console.WriteLine(i);
    }

4、队列

队列(Queue)特点:删除只能在队头,插入只能在队尾,具有先进先出的规则。 比如队列元素为abc,则执行删除操作后,删除后的元素的序列为bc

    Queue q = new Queue();
    q.Enqueue('a');//添加元素a
    q.Enqueue('b');//添加元素b
    q.Enqueue('c');//添加元素c
    Console.WriteLine("删除前该队列的元素个数为:"+q.Count);
    Console.Write("该队列的元素主要有:");
    foreach (char i in q) { 
    Console.Write(i+" ");
    }
    Console.WriteLine();
    q.Dequeue();//删除元素
    Console.WriteLine("删除后该队列的元素个数为:" + q.Count);
    Console.Write("该队列的元素主要有:");
    foreach (char i in q)
    {
        Console.Write(i + " ");
    }

运行结果:

image.png

5、堆栈

特点: 后进先出,添加称为推入,删除称为弹出。

    Stack s = new Stack();
    s.Push('a');//添加元素a
    s.Push('b');//添加元素b
    s.Push('c');//添加元素c
    Console.WriteLine("删除前该栈的元素个数为:" + s.Count);
    Console.Write("该栈的元素主要有:");
    foreach (char i in s)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();
    s.Pop();//删除元素
    Console.WriteLine("删除后该栈的元素个数为:" + s.Count);
    Console.Write("该栈的元素主要有:");
    foreach (char i in s)
    {
        Console.Write(i + " ");
    }

运行结果:

image.png

6、哈希表

    Hashtable  test = new Hashtable();
    test.Add("001","张三");//Add(Key,Value).添加键 值
    test.Add("002","李四");
    //ContainsValue判断test中是否包含特定的值
    if (test.ContainsValue("张三"))
    {
        Console.WriteLine("名单上已经有这个名字了");
    }
    else {
        test.Add("003", "王五");
    }
    ICollection key = test.Keys;//获取键的集合
    foreach (string i in key) {
        Console.WriteLine("学号: " + i + "  姓名: "+test[i]);//获取键和值
    }

运行结果:

image.png

7、字典

注意:适用于索引号为非int类型数据,如string类型或其他类型。 是一种可以让我们通过索引号查询到特定数据的数据结构类型

  Dictionary<string, string> student = new               Dictionary<string, string>();
    student.Add("s001", "张三");//添加元素
    student.Add("s002", "张四");
    student.Add("s003", "张五");
    student["s003"] = "老六";//修改值
    student.Remove("s003");//删除键
    //查询Keys
    foreach (string key in student.Keys)
    {
        Console.WriteLine(key);
        //查询Values
        foreach (string value in student.Values)
        {
            Console.WriteLine(value);
        }
        foreach (KeyValuePair<string,string> stu in student)//查询Keys和Values
        {
            Console.WriteLine("Key:"+stu.Key+"  Name:"+stu.Value);
            }
    }
    
    

运行结果:

image.png