【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("存在");
    }
正向查找元素位置
	找到的返回值是位置,没找到返回-1
    int 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、转换为数组for
    object[] 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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赣红孵联合卫东街道未保站开展未成年人保护法散落在每个角落活动

为进一步提高家长的法治意识&#xff0c;依法保障未成年人的合法权益&#xff0c;全力构建安全和谐文明家庭&#xff0c;5月8日&#xff0c;赣红孵社会组织培育中心联合卫东街道未成年人保护站在在南师附小红谷滩校区实验小学开展“未成年人保护法散落在每个角落”未成年人普法…

无列名注入

在进行sql注入时&#xff0c;一般都是使用 information_schema 库来获取表名与列名&#xff0c;因此有一种场景是传入参数时会将 information_schema 过滤 在这种情况下&#xff0c;由于 information_schema 无法使用&#xff0c;我们无法获取表名与列名。 表名获取方式 Inn…

如何通过汽车制造供应商协同平台,提高供应链的效率与稳定性?

汽车制造供应商协同是指在汽车制造过程中&#xff0c;整车制造商与其零部件供应商之间建立的一种紧密合作的关系。这种协同关系旨在优化整个供应链的效率&#xff0c;降低成本&#xff0c;提高产品质量&#xff0c;加快创新速度&#xff0c;并最终提升整个汽车产业的竞争力。以…

龙芯LA架构相关的存储管理

&#xff08;LoongArch-P92&#xff09; 目录 1.1 物理地址空间 1.2 虚拟地址空间 1.3 LA64架构下的虚拟地址缩减模式 1.4 存储访问类型 1.5 页表映射存储管理 1.5.1 TLB组织结构 1.5.2 基于TLB的虚实地址转换过程 1.5.3 TLB的软件管理 &#xff08;1&#xff09;…

计算概论学习笔记(1)

感谢北大李戈老师讲解的计算概论。 【道阻且长&#xff0c;行则将至】 很多年没有intensive coding&#xff0c;现在这个系列是coding retake&#xff0c;一点点回忆之前的知识&#xff0c;希望能重回到一线。主要内容包括C,C,Pytorch学术前沿项目学习和实践&#xff0c;预计…

线路和绕组中的波过程(一)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第一篇笔记。下一篇传送门。 当电路中的设备&#xff08;元件&#xff09;最大实际尺寸l大于人们所感兴趣的谐波波长 λ \lambda λ时&#xff0c;可以作为集中参数处理&#xff0c;否则就要当做分布参数处理。即&…

C语言 [力扣]详解环形链表和环形链表II

各位友友们&#xff0c;好久不见呀&#xff01;又到了我们相遇的时候&#xff0c;每次相遇都是一种缘分。但我更加希望我的文章可以帮助到大家。下面就来具体看看今天所要讲的题目。 文章目录 1.环形链表2.环形链表II 1.环形链表 题目描述:https://leetcode.cn/problems/link…

Babel基础知识及实现埋点插件

目录 前言 AST 遍历 Visitors Paths&#xff08;路径&#xff09; Paths in Visitors&#xff08;存在于访问者中的路径&#xff09; State&#xff08;状态&#xff09; Scopes&#xff08;作用域&#xff09; Bindings&#xff08;绑定&#xff09; API babylo…

「TypeScript」TypeScript入门练手题

前言 TypeScript 越来越火&#xff0c;现在很多前端团队都使用它&#xff0c;因此咱们前端码农要想胜任以后的前端工作&#xff0c;就要更加熟悉它。 入门练手题 interface A {x: number;y: number; }type T Partial<A>;const a: T { x: 0, y: 0 }; const b: T { …

LLM 可以从简单数据中学习吗?

在 10 月份的一次周会结束后&#xff0c;我提到 SFT 训练后的 Loss 曲线呈现阶梯状&#xff0c;至于为什么&#xff0c;并没有人有合理的解释&#xff0c;加上当时的重心是提升次日留存率&#xff0c;Loss 曲线呈现阶梯状与次日留存率的关系还太远&#xff0c;即使有问题&#…

使用单片机的IO引脚直接驱动段码屏

使用单片机的IO引脚直接驱动段码屏,目的是为了降低成本。这种古老的应用,在低功耗产品中比较多见。 如:水表&#xff0c;燃气表等需要电池供电的产品。 下面纯属个人理解&#xff0c;未经测试。 1/3Duty表示LCD共有3个COM引脚,分别占显示周期的1/3 1/2BIAS表示电压0和VCC 1、…

2024年记一次Mingw64-13.2.0编译Qt6.6.3,包含文档编译。

My C Development. 前言&#xff1a;不包含qtwebengine。 一、准备文件 &#xff08;1&#xff09;mingw64-13.2.0 下载链接&#xff1a;&#xff0c;ucrt64_13.2_ucrt_posix_rev6_msys2.7z【蓝奏云】。 &#xff08;2&#xff09;qt6.6.3源码 下载链接&#xff1a;Downlo…

纯血鸿蒙APP实战开发——一镜到底“页面转场”动画

介绍 本方案做的是页面点击卡片跳转到详情预览的转场动画效果 效果图预览 使用说明 点击首页卡片跳转到详情页&#xff0c;再点击进入路由页面按钮&#xff0c;进入新的路由页面 实现思路 首页使用了一种视觉上看起来像是组件的转场动画&#xff0c;这种转场动画通常是通过…

opencv绘制灰度直方图-------c++

灰度直方图 cv::Mat opencvTool::calculateHistogram(const cv::Mat& image) {// 如果输入图像尚未处于灰度级&#xff0c;请将其转换为灰度级cv::Mat grayscale_image;if (image.channels() > 1){cv::cvtColor(image, grayscale_image, cv::COLOR_BGR2GRAY);}else{gra…

求一个B站屏蔽竖屏视频的脚本

求一个B站屏蔽竖屏视频的脚本 现在B站竖屏竖屏越来越多了&#xff0c;手机还好点给我一个按钮&#xff0c;选择不喜欢&#xff0c;但是我一般都用网页版看视屏&#xff0c;网页版不给我选择不喜欢的按钮&#xff0c;目测大概1/4到1/3的视频都是竖屏视频。 目前网页版唯一的进…

使用AudioCraft(MusicGen)生成音乐

AudioCraft 是一个 PyTorch 库,用于音频生成的深度学习研究。AudioCraft 包含 AudioGen 和 MusicGen 两个最先进的人工智能生成模型的推理和训练代码,用于生成高质量的音频。 MusicGen 是一种简单可控的音乐生成模型,它使用Meta 20K 小时的授权音乐来进行训练,能够生成与文…

SM4在线解密工具(支持GCM模式)

SM4在线解密工具(支持GCM模式)

spring boot参数验证注解@NotNull、@NotBlank和@NotEmpty区别

目录 前言说明举例 前言 使用spring boot参数验证是常常会使用NotNull、NotBlank和NotEmpty三个判断是否不为空的注解&#xff0c;中文都有不能为空的意思&#xff0c;大部分使用者都傻傻分清它们之间到底有什么区别。今天就让咱们来一起探索它们之间的不同吧。 说明 注解名…

rngd: Error writing /dev/tpm0

检查数据库时发现messages中一直有rngd报错&#xff0c;rngd一直未配置&#xff0c;直接关闭了 /var/log/messages-20240414:Apr 11 04:59:49 hydb2 rngd: Error writing /dev/tpm0 /var/log/messages-20240414:Apr 12 07:31:39 hydb2 rngd: Error writing /dev/tpm0 /var/log…

深度学习之前馈神经网络

1.导入常用工具包 #在终端中输入以下命令就可以安装工具包 pip install numpy pip install pandas Pip install matplotlib注&#xff1a; numpy是科学计算基础包 pandas能方便处理结构化数据和函数 matplotlib主要用于绘制图表。 #导包的代码&#xff1a; import numpy as n…