天天看点

C#进阶01——简单数据结构类1.ArrayList 2.Stack3.Queue4.Hashtable1.Hashtable的本质

1.ArrayList

1.ArrayList的本质

ArrayList是一个C#为我们封装好的类

它的本质是一个object类型的数组

ArrayList类帮助我们实现了很多方法

比如数组的增删查改

2.申明

需要引用命名空间 using System.Collections;

ArrayList array = new ArrayList();

3.增删查改

1.增

array.Add(1);
            array.Add("123");
            array.Add(true);
            array.Add(new object());
            array.Add(new Test());
            array.Add(1);
            array.Add(true);
 
            ArrayList array2 = new ArrayList();
            array2.Add(123);
            //范围增加 (批量增加 把另一个list容器里面的内容加到后面)
            array.AddRange(array2);
 
            //插入元素 (位置,插入内容)
            array.Insert(1, "123456");
            Console.WriteLine(array[1]);//123456
           

2.删

//移除指定元素 从头找 找到就删
            array.Remove(1);
            //移除指定位置的元素
            array.RemoveAt(2);
            //清空
            //array.Clear();
           

3.查

//得到指定位置的元素
            Console.WriteLine(array[0]);
            //查看元素是否存在
            if (array.Contains("123"))
            {
                Console.WriteLine("存在123");
            }
            //正向查找元素位置
            //找到的返回值 是位置 找不到 返回值就是-1
            int index = array.IndexOf(true);
            Console.WriteLine(index);//1
            index = array.IndexOf(false);
            Console.WriteLine(index);//-1
 
            //反向查找元素位置
            //返回是从头开始的索引数
            index = array.LastIndexOf(true);
            Console.WriteLine(index);//4
           

4.改

Console.WriteLine(array[0]);
            array[0] = "999";
            Console.WriteLine(array[0]);
           

 5.遍历

//长度
            Console.WriteLine(array.Count);//7
            //容量
            //避免产生过多的垃圾
            Console.WriteLine(array.Capacity);//16
            Console.WriteLine("*******************");
            for (int i = 0; i < array.Count; i++)
            {
                Console.Write(array[i]);
            }
            Console.WriteLine("");
 
            //迭代器遍历
            foreach (object item in array)
            {
                Console.Write(item);
            }
           

4.装箱拆箱

ArrayList本质上是一个可以自动扩容的object数组

由于用万物之父来存储数据,自然存在装箱拆箱

当往其中进行值类型存储时就是在装箱,当将值类型对象取出来转换使用时,就是在拆箱

所以ArrayList尽量少用,之后我们会学习更好的数据容器

int k = 1;
            array[0] = k;//装箱
            k = (int)array[0];//拆箱
           

 2.Stack

1.Stack的本质

Stack(栈)是一个C#为我们封装好的类

它的本质也是object[]数组,只是封装了特殊的存储规则

Stack是栈存储容器,栈是一种先进后出的数据结构

先存入的数据后获取,后存入的数据先获取

栈是先进后出

2.申明

需要引用命名空间 using System.Collections;

Stack stack = new Stack();

3.增取查改

1.增

//压栈
            stack.Push(1);
            stack.Push("123");
            stack.Push(true);
            stack.Push(1.2f);
            stack.Push(new Test());
           

 2.取

//栈中不存在删除的概念
            //只有取的概念
            //弹栈
            object v = stack.Pop();
            Console.WriteLine(v);
 
            v = stack.Pop();
            Console.WriteLine(v);//1.2f
           

3.查

//1.栈无法查看指定位置的 元素
            // 只能查看栈顶的内容
            v = stack.Peek();//只查看,不取出
            Console.WriteLine(v);
            Console.WriteLine(v);
 
            //2.查看元素是否存在于栈中
            if (stack.Contains(1.2f))
            {
                Console.WriteLine("存在1.2f");
            }
            //无输出
            if (stack.Contains("123"))
            {
                Console.WriteLine("存在123");
            }
            //存在123
           

4.改

//栈无法改变其中的元素 只能压(存)和弹(取)
            //实在要改 只有清空
            stack.Clear();
            Console.WriteLine(stack.Count);//0
            stack.Push("1");
            stack.Push(2);
            stack.Push("哈哈哈");
           

5.遍历

//1.长度
            Console.WriteLine(stack.Count);//3
 
            //2.用foreach遍历
            //  而且遍历出来的顺序 也是从栈顶到栈底
            foreach (object item in stack)
            {
                Console.WriteLine(item);
            }
 
            //3.还有一种遍历方式
            //  将栈转换为object数组
            //  遍历出来的顺序 也是从栈顶到栈底
            object[] array = stack.ToArray();
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);
            }
 
            //4.循环弹栈
            while (stack.Count > 0)
            {
                /*object o = stack.Pop();
                Console.WriteLine(o);*/
                Console.WriteLine(stack.Pop());
            }
            Console.WriteLine(stack.Count);
           

4.装箱拆箱

由于用万物之父来存储数据,自然存在装箱拆箱

当往其中进行值类型存储时就是在装箱

当将值类型对象取出来转换使用时,就存在拆箱

3.Queue

1.Queue本质

Queue是一个C#为我们封装好的类

它的本质也是object[]数组,只是封装了特殊的存储规则

Queue是队列存储容器

队列是一种先进先出的数据结构

先存入的数据先获取,后存入的数据后获取

2.申明 

需要引用命名空间 using System.Collections;

Queue queue = new Queue();

3.增取查改

1.增

queue.Enqueue(1);
            queue.Enqueue("123");
            queue.Enqueue(1.4f);
            queue.Enqueue(new Test());
           

2.取

//队列中不存在删除概念
            //只有取的概念 取出先加入的对象
            object v = queue.Dequeue();
            Console.WriteLine(v);//1
            v = queue.Dequeue();
            Console.WriteLine(v);//123
           

3.查

//1.查看队列头部元素但不会移除
            v = queue.Peek();
            Console.WriteLine(v);//1.4
            v = queue.Peek();
            Console.WriteLine(v);//1.4
 
            //2.查看元素是否存在于队列中
            if (queue.Contains(1.4f))
            {
                Console.WriteLine("队列中存在1.4f");
            }
           

4.改 

//队列无法改变其中的元素 只能进出队列
            //实在要改 只有清空
            Console.WriteLine(queue.Count);//2
            queue.Clear();
            queue.Enqueue(1);
            queue.Enqueue(2);
            queue.Enqueue(3);
           

5.遍历

//1.长度
            Console.WriteLine(queue.Count);//3
            //2.用foreach遍历
            foreach (object item in queue)
            {
                Console.WriteLine(item);
            }
            //3.还有一种遍历方式
            //  将队列转换为object数组
            object[] array = queue.ToArray();
            for (int i = 0; i < queue.Count; i++)
            {
                Console.WriteLine(array[i]);
            }
            //4.循环出列
            while (queue.Count > 0)
            {
                Console.WriteLine(queue.Dequeue());
            }
           

4.装箱拆箱

由于用万物之父来存储数据,自然存在装箱拆箱

当往其中进行值类型存储时就是在装箱

当将值类型对象取出来转换使用时,就存在拆箱

4.Hashtable

1.Hashtable的本质

Hashtable(又称散列表)是基于键的哈希代码组织起来的 键/值对

它的主要作用是提高数据查询的效率

使用键来访问集合中的元素

2.申明

需要引用命名空间 using System.Collections;

Hashtable hashtable = new Hashtable();

3.增删查改

1.增

hashtable.Add(1, "123");
            hashtable.Add("123", 1);
            hashtable.Add(true, false);
            hashtable.Add(false, false);
            //注意:不能出现相同键
           

2.删

//1.只能通过键去删除
            hashtable.Remove(1);
            //2.删除不存在的键 没反应
            hashtable.Remove(2);
            //3.或者直接清空
            hashtable.Clear();
            hashtable.Add(1, "123");
            hashtable.Add(2, "1234");
            hashtable.Add(3, "123");
            hashtable.Add("123123", 12);
           

3.查

//1.通过键查看值
            //  找不到会返回空
            Console.WriteLine(hashtable[1]);//123
            Console.WriteLine(hashtable[4]);//返回空
            Console.WriteLine(hashtable["123123"]);//12
 
            //2.查看是否存在
            //  根据键检测
            if (hashtable.Contains(2))
            {
                Console.WriteLine("存在键为2的键值对");
            }
            if (hashtable.ContainsKey(2))
            {
                Console.WriteLine("存在键为2的键值对");
            }
            // 根据值去检测
            if (hashtable.ContainsValue(12))
            {
                Console.WriteLine("存在值为12的键值对");
            }
           

4.改 

//只能改 键对应的值内容 无法修改键
            Console.WriteLine(hashtable[1]);
            hashtable[1] = 100.5f;
            Console.WriteLine(hashtable[1]);
           

5.遍历

//得到键值对 对数
            Console.WriteLine(hashtable.Count);
 
            //1.遍历所有键
            foreach (object item in hashtable.Keys)
            {
                Console.WriteLine("键:"+item);
                Console.WriteLine("值:" + hashtable[item]);
            }
            Console.WriteLine();
            //2.遍历所有值
            foreach (object item in hashtable.Values)
            {
                Console.WriteLine("值:"+item);
            }
 
            //3.键值对一起遍历
            foreach (DictionaryEntry item in hashtable)
            {
                Console.WriteLine("键:" + item.Key + " 值:" + item.Value);
            }
 
            //4.迭代器遍历法
            IDictionaryEnumerator myEnumerator = hashtable.GetEnumerator();
            bool flag = myEnumerator.MoveNext();
            while (flag)
            {
                Console.WriteLine("键:" + myEnumerator.Key + " 值:" + myEnumerator.Value);
                flag = myEnumerator.MoveNext();
            }
           

4.装箱拆箱

由于用万物之父来存储数据,自然存在装箱拆箱

当往其中进行值类型存储时就是在装箱

当将值类型对象取出来转换使用时,就存在拆箱