【C#进阶】简单数据结构类

在这里插入图片描述
简单数据结构类
在这里插入图片描述

文章目录

      • 1、Arraylist
        • 1、ArrayList的本质
        • 2、声明
        • 3、增删查改
        • 4、装箱拆箱
          • 思考 背包售卖
      • 2、Stack
        • 1、Stack的本质
        • 2、声明
        • 3、增取查改
        • 4、遍历
          • 思考 计算一个数的二进制
      • 3、Queue
        • 1、Queue的本质
        • 2、声明
        • 3、增取查改
        • 4、遍历
          • 思考 每隔一段时间打印一条消息
      • 4、Hashtable
        • 1、Hashtable本质
        • 2、声明
        • 3、增删查改
        • 4、遍历
          • 思考 单例制造怪物工厂

1、Arraylist

1、ArrayList的本质
ArrayLists是一个C#为封装好的类
它的本质是一个Object类型的数组
2、声明
using System.Collections;
ArrayList array = new ArrayList();
3、增删查改

array.Add(1);
ArrayList array2 = new ArrayList();
array2.Add(true);
//批量增加
array.AddRange(array2);array.Insert(1,"222");

移除指定元素array.Remove(1);
移除指定位置的元素array.RemoveAt(2);
清空array.Clear();

得到指定的元素array[0];
查看元素是否存在if(array.Contains("1")){Console.WriteLine("存在");}
正向查找元素位置找到的返回值是位置,没找到返回-1int index = array.IndexOf(true);Console.WriteLine(index);反向查找元素位置int index = array.LastIndexOf(true);Console.WriteLine(index);

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

遍历

长度Console.WriteLine(array.Count);
容量Console.WriteLine(array.Capacity);
遍历for(int i = 0; i < array.Count; i++){Console.WriteLine(array[i]);}
迭代器遍历foreach (object item in arrayList){Console.WriteLine(item);}
4、装箱拆箱
ArrayList本质是一个可以自动扩容的object数组
存储值类型装箱,将值类型取出来拆箱int i = 1;array[0] = i;		//装箱i = (int)array[0];	//拆箱
思考 背包售卖
//创建一个背包管理类,使用ArrayList存储物品
//实现购买物品,卖出物品,显示物品的功能;购买与卖出会导致金钱的变化
BagMgr bag = new BagMgr(9999);
Item i1 = new Item(1,9,"药",5);
Item i2 = new Item(2,99,"书",3);
Item i3 = new Item(3,999,"刀",1);
bag.BuyItem(i1);
bag.BuyItem(i2);
bag.BuyItem(i3);bag.SellItem(i3);
bag.SellItem(1,1);
bag.SellItem(2,1);
class BagMgr
{private ArrayList items;private int money;public BagMgr(int money){this.money = money;items = new ArrayList();}public void BuyItem(Item item){if (item.num <= 0 || item.money < 0){Console.WriteLine("错误物品或金钱");return;}if (money < item.money * item.num){Console.WriteLine("钱不够");return;}money -= item.money * item.num;Console.WriteLine("购买{0}{1}个,花费{2}钱,余额{3}", item.name,item.num,item.money*item.num,money);for (int i = 0; i < items.Count;i++){if ((items[i] as Item).id == item.id){(items[i] as Item).num += item.num;return;}}items.Add(item);}public void SellItem(Item item){for (int i = 0; i < items.Count; i++){if ((items[i] as Item).id == item.id){int num = 0;string name = (items[i] as Item).name;int money = (items[i] as Item).money;if ((items[i] as Item).num > item.num){num = item.num;}else{num = (items[i] as Item).num;items.RemoveAt(i);}int sellMoney = money* num;this.money += sellMoney;Console.WriteLine("卖了{0}{1}个,赚了{2},余额{3}", name, num, sellMoney, this.money);return;}}}public void SellItem(int id, int num = 1){Item item = new Item(id,num);SellItem(item);}public void ShowItem(){Item item;for (int i = 0; i < items.Count; i++){item = items[i] as Item;Console.WriteLine("有{0}{1}个", item.name, item.num);}Console.WriteLine("余额{0}",money);}
}
class Item
{public int id;public int money;public string name;public int num;public Item(int id, int num){this.id = id;this.num = num;}public Item(int id, int money, string name, int num){this.id = id;this.money = money;this.name = name;this.num = num;}
}

2、Stack

1、Stack的本质
Stack 是一个C#为我们封装好的类
它的本质是Object[]数组
Stack是栈存储容器,栈是一种先进后出的数据结构
2、声明
Stack stack = new Stack();
3、增取查改
//压栈stack.Push(1);stack.Push("123");stack.Push(true);//弹栈//栈中不存在删除的概念,只有取的概念object v1 = stack.Pop();Console.WriteLine(v1);v1 = stack.Pop();Console.WriteLine(v1);//栈无法查看指定位置的元素,只能查看栈顶的内容v1 = stack.Peek();Console.WriteLine(v1);//2、查看元素是否存在于栈中if (stack.Contains("123")){Console.WriteLine("存在123");}//栈无法改变其中的元素,只能存和取,有清空方法stack.Clear();
4、遍历
1、长度Console.WriteLine(stack.Count);2、用foreack遍历//遍历出来的顺序从顶到低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 item = stack.Pop();Console.WriteLine(item);}
思考 计算一个数的二进制
//写一个方法计算任意一个数的二进制
//使用栈结构方式存储,之后打印处理
Calc(10);
static void Calc(uint num)
{Stack stack = new Stack();while (true){stack.Push(num % 2);num /= 2;if (num == 1 || num ==0){stack.Push(num);break;}}while(stack.Count > 0){Console.Write(stack.Pop());}
}

3、Queue

1、Queue的本质
Stack 是一个C#为我们封装好的类
它的本质是Object[]数组
Queue是队列存储容器
队列是一种先进先出的数据结构
2、声明
Queue queue = new Queue();
3、增取查改
Queue queue = new Queue();queue.Enqueue(1);queue.Enqueue("123");queue.Enqueue(1.3f);
取 取出先进入的对象object v = queue.Dequeue();Console.WriteLine(v);1、查看队列头部元素但不会移除v = queue.Peek();2、查看元素是否存在于队列中if (queue.Contains(1.3f){Console.WriteLine("存在");}queue.Clear();
4、遍历
1、长度Console.WriteLine(queue.Count);
2、用foreach遍历foreach (object o in queue){Console.WriteLine(o);}
3、转换为数组forobject[] array = queue.ToArray();for (int i = 0; i < array.Length; i++){Console.WriteLine(array[i]);}
4、循环出列while (queue.Count > 0){object o = queue.Dequeue();Console.WriteLine(o);}
思考 每隔一段时间打印一条消息
//使用队列存储消息,一次性存10条消息,每隔一段时间打印一条消息
//控制台打印消息时要有明显顿挫感
Queue queue = new Queue();
queue.Enqueue("获得44金币");
queue.Enqueue("获得装备");
queue.Enqueue("获得药草");
queue.Enqueue("获得经验");
queue.Enqueue("获得秘籍");
queue.Enqueue("获得顶级秘笈");queue.Enqueue("获得装备");
queue.Enqueue("获得药草");
queue.Enqueue("获得经验");
queue.Enqueue("获得秘籍");
queue.Enqueue("获得无上心法");int updateIndex = 1;
while (queue.Count > 0)
{if (updateIndex % 77777777 == 0){if (queue.Count > 0){Console.WriteLine(queue.Dequeue());}updateIndex = 0;}updateIndex++;
}

4、Hashtable

1、Hashtable本质
Hashtable(散列表)是基于键的哈希代码组织起来的键值对
它的主要作用是提高数据查询的效率
使用键来访问集合中的元素
2、声明
Hashtable hashtable = new Hashtable();	
3、增删查改
//不能出现相同的键hashtable.Add(1,"234");hashtable.Add(2,"255");//1、只能通过键去删除hashtable.Remove(2);//删除不存在的键,没反应//2、直接清空hashtable.Clear();//1、通过键查看值,找不到返回空Console.WriteLine(hashtable[1]);//2、查看书否存在//根据键检测if (hashtable.Contains(1)){Console.WriteLine("存在");}if (hashtable.ContainsKey(2)){Console.WriteLine("存在");}
//根据值检测if (hashtable.ContainsValue("255")){Console.WriteLine("存在");}//只能改键对应的值内容,无法改键hashtable[1] = false;
4、遍历
得到键值对 对数Console.WriteLine(hashtable.Count);
1、遍历所有键foreach (Hashtable ht in hashtable.Keys){Console.WriteLine("键" + ht);Console.WriteLine("值" + hashtable[ht]);}
2、遍历所有值foreach (Hashtable ht in hashtable.Values){Console.WriteLine("值" + ht);}
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();}
思考 单例制造怪物工厂
//制作一个怪物类管理器,提供创建怪物
//移除怪物的方法,每个怪物都有自己的唯一id
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.RemoveMonster(0);
MonsterMgr.Instance.RemoveMonster(5);
class MonsterMgr 
{ private static MonsterMgr instance = new MonsterMgr();private Hashtable monstersTable = new Hashtable();private MonsterMgr() { }public static MonsterMgr Instance{get{return instance;}}private int monsterID = 0;public void AddMonster(){Monster monster = new Monster(monsterID);Console.WriteLine("创建了id为{0}怪物", monsterID);monsterID++;monstersTable.Add(monster.id, monster);}public void RemoveMonster(int monsterID) { if(monstersTable.ContainsKey(monsterID)){(monstersTable[monsterID] as Monster).Dead();monstersTable.Remove(monsterID);}}
}
class Monster
{public int id;public Monster(int id){this.id = id;}public void Dead(){Console.WriteLine("怪物{0}死亡",id);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何加密保护U盘?U盘加密方法盘点

U盘是目前最常用的移动存储设备&#xff0c;可以帮助我们存储大量数据。而为了保护数据安全&#xff0c;我们需要加密保护U盘。下面我们就来盘点一下U盘加密的方法。 BitLocker加密 BitLocker是Windows的一种磁盘保护工具&#xff0c;通过加密整个磁盘来保护数据&#xff0c;同…

基于Springboot的校园疫情防控信息管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园疫情防控信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

Vscode编辑器 js 输入log自动补全

最近换了新电脑&#xff0c;新下载了Vscode&#xff0c;记录一下设置项。 Vscode 版本 想要的效果 js文件中输入log&#xff08;点击tab键&#xff09;&#xff0c;自动补全为 console.log() Vscode 文件》首选项》设置 搜索&#xff1a;snippets Emmet: Show Suggestions…

暗区突围TWITCH掉宝领测试资格后,steam激活显示是无效激活码

自《暗区突围》测试启动以来&#xff0c;吸引了大量玩家关注&#xff0c;特别是通过在Twitch平台上观看直播即可获得测试资格的活动&#xff0c;更是掀起了热潮。然而&#xff0c;部分玩家在成功获得激活码后&#xff0c;在Steam平台激活时遭遇了“无效激活码”的问题。本文将提…

nginx 配置域名SSL证书HTTPS服务

下载 上传根目录 /home/wwwroot/xx.com/ssl 从新执行 添加域名命令 选择添加SSL SSL Certificate file: 填写 完整目录 PEM文件地址 SSL Certificate Key file:填写 完整目录 key文件地址

python 对矩阵与矩阵之间对应位置的元素,做softmax操作,代码实战

1.对矩阵中对应位置的元素&#xff0c;做softmax 对于一个向量&#xff0c;softmax函数会对其中每一个元素进行指数运算&#xff0c;然后除以所有元素指数和的结果。当将其应用到多个矩阵的相应位置上时&#xff0c;我们实际上是在对每个位置的一组数&#xff08;从各个矩阵的同…

45.WEB渗透测试-信息收集-域名、指纹收集(7)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;计算机王-CSDN博客 WEB指纹&#xff1a;Web指纹也叫web应用指纹。由于所使用的工具、技术…

PHP 自提时间

前端: 后台设置: 代码: public function getBusinessHour(){// 需求单门店$data (new StoreModel())->limit(1)->select()->toArray();$days explode(,, $data[0][shop_hours]);$businessHours $days[1];// 使用 explode 分割字符串&#xff0c;获取开始和结束时…

nginx 发布静态资源

一. nginx 发布静态资源 在nginx中nginx.conf配置文件中添加内容如下&#xff1a; server {listen 90;server_name localhost;# 配置静态资源文件&#xff0c;就可以访问了location / {root /home/fooie-shop;index index.html;}# 配置音频和图片资源location /imoo…

企业内部文化社区究竟有哪些好处?

首先&#xff0c;我们来了解下&#xff0c;企业内耗是什么? 在企业文化管理中&#xff0c;内耗是一个常见的问题&#xff0c;它会影响企业的团队协作、执行效率和绩效表现。在2023《哈佛商业评论》中国年会上&#xff0c;北大汇丰商学院管理实践教授陈玮分享了他对组织管理的…

冯喜运:5.14今日黄金原油涨跌走势分析操作建议

【黄金消息面分析】&#xff1a;本周黄金市场将迎来关键的美国通胀数据&#xff0c;包括周二的生产者价格指数(PPI)和周三的消费者物价指数(CPI)。这些数据对美联储的政策路径至关重要&#xff0c;可能会影响市场对利率调整的预期。目前&#xff0c;现货黄金价格小幅上涨&#…

使用java.io库序列化Java对象

在我们使用诸如Redis这类缓存系统时&#xff0c;我们往往会存在如下需求&#xff1a;将Java对象保存到Redis缓存中&#xff0c;然后在其他机器上还原回来。 Json方案 我们可以引入Json库等方式&#xff0c;将Java对象序列化为Json字符串来实现这个目的&#xff0c;但是这样的…

《四》系统模块整体功能关联与实现

在上一篇里&#xff0c;我们完成了动作的创建&#xff0c;那么这一次&#xff0c;我们把它加载到界面上&#xff0c;把需要是实现的动作都加上。 MyWord::MyWord(QWidget *parent): QMainWindow(parent) {mdiAreanew QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::S…

【Cesium解读】Cesium中primitive/entity贴地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推荐&#xff1a;Cesium贴地设置_primitive贴地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

Android Q - 音频通路调试

对于当前模块不是很清楚&#xff0c;刚好有个项目这方面有点问题&#xff0c;根据展锐支持文档一步步检查就可以了。首先得先弄清楚硬件具体是怎么连接的&#xff0c;比如文档提到的案例&#xff1a;sprd codec speaker output 连接外部 PA。 耳机接的是什么&#xff0c;speake…

C/C++关键字:extern

文章目录 一、extern&#xff1a;声明外部变量或外部函数1.extern的作用2.代码举例①例1②例2③例3 一、extern&#xff1a;声明外部变量或外部函数 1.extern的作用 extern的作用&#xff1a;声明外部的全局变量或外部的函数&#xff0c;以实现跨文件使用其他.c/.h文件的全局…

C语言中数组与指针的区别

一. 简介 本文学习了 C语言中数组与指针的区别。这样的话&#xff0c;可以在编写C代码时规避掉出错的问题。 二. C语言中数组与指针的区别 1. 数组 定义字符串数组时&#xff0c;必须让编译器知道需要多少空间。 一种方法是用足够空间的数组存储字符串。例如如下&#xf…

DOM重点核心(注册事件+DOM事件流)

目录 1.注册事件 注册时间概述 addEventListener() 删除事件 2.DOM事件流 DOM事件流理论 事件对象 事件对象的常见属性和方法 e.targe 和 this的区别 阻止默认行为 阻止冒泡 事件委托 禁止右键菜单和禁止选中文字 获得鼠标的坐标&#xff08;可视区、页面、浏览器…

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

分享一个非常好用的安装包下载网站

当我们需要下载linux下的某些包,以便在自己的环境下进行编译自己的安装包的时候,可能需要用到一些各种版本的依赖包,从网上 百度会很麻烦。 这里分享一个很好用的安装包下载网站,记得点赞收藏 网站: Red Hat Enterprise Linux Repositories - pkgs.org 找到对应系统,然…