C#常见的.Net类型(二)
目录
- 一、在集合中存储多个对象
- 理解集合的选择
- 1.列表
- 2.字典
- 3.堆栈
- 4.队列
- 5.集
- 二、使用Span、索引和范围
- Span
- 索引
- 范围
- 处理类型和属性
- 1.特性
- 2.创建自定义特性
- 3.反射
一、在集合中存储多个对象
处理集合的常见类型
| 类型 | 描述 |
|---|---|
| List | 动态大小的数组,可以按索引访问 |
| Dictionary<TKey, TValue> | 键值对集合,根据键进行快速查找 |
| Queue | 先进先出的队列集合 |
| Stack | 后进先出的栈集合 |
| HashSet | 不包含重复元素的集合 |
| LinkedList | 双向链表集合 |
理解集合的选择
1.列表
C#中的列表(List)是一种动态数组,可以根据需要自动调整大小。它允许按索引访问、添加、删除和搜索元素。列表提供了丰富的方法和功能,使得对集合进行操作变得更加简单和高效。 Lists 提供了泛型支持,因此你可以创建包含任意类型元素的列表。
using System;
using System.Collections.Generic;class Program
{static void Main(){// 使用 List<T>List<int> numbers = new List<int>();numbers.Add(1);numbers.Add(2);numbers.Add(3);foreach (int number in numbers){Console.WriteLine(number);}}
}
2.字典
C#中的字典(Dictionary)是一种键值对集合,其中每个键都必须是唯一的。字典提供了快速的键查找功能,可以根据键获取对应的值。字典也是动态大小的,可以根据需要自动调整大小。通过泛型支持,字典可以存储任意类型的键和值。字典提供了丰富的方法和功能,如添加、移除和检索键值对等操作,使得对键值对数据进行管理变得更加方便和高效。
using System;
using System.Collections.Generic;class Program
{static void Main(){// 使用 Dictionary<TKey, TValue>Dictionary<string, string> capitals = new Dictionary<string, string>();capitals.Add("Japan", "Tokyo");capitals.Add("France", "Paris");capitals.Add("Italy", "Rome");foreach (var country in capitals){Console.WriteLine($"The capital of {country.Key} is {country.Value}");}}
}
3.堆栈
C#中的堆栈(Stack)是一种后进先出(LIFO)的数据结构,类似于现实生活中的堆放物品的方式。在堆栈中,最后一个添加的元素将被最先移除。堆栈提供了 Push 方法用于向堆栈顶部添加元素,以及 Pop 方法用于移除并返回顶部的元素。此外,你还可以使用 Peek 方法查看但不移除顶部的元素。堆栈通常用于需要按照特定顺序处理数据的场景,例如计算表达式、撤销操作等。在C#中,你可以使用 System.Collections.Generic 命名空间中的 Stack 类来实现堆栈数据结构。
4.队列
C#中的队列(Queue)是一种先进先出(FIFO)的数据结构,类似于排队等候的方式。在队列中,最先添加的元素将会被最先移除。队列提供了 Enqueue 方法用于向队列尾部添加元素,以及 Dequeue 方法用于移除并返回队列头部的元素。此外,你还可以使用 Peek 方法查看但不移除队列头部的元素。队列通常用于需要按照特定顺序处理数据的场景,例如任务调度、消息传递等。在C#中,你可以使用 System.Collections.Generic 命名空间中的 Queue 类来实现队列数据结构。
5.集
在C#中,“集”通常指的是集合(collection),它是一种用于存储和操作多个元素的数据结构。C#中提供了许多不同类型的集合,如 List、Dictionary、Queue 和 Stack 等,每种集合类型都具有特定的行为和用途。这些集合类型可以帮助开发者更有效地组织和处理数据,以及实现各种算法和数据结构。
二、使用Span、索引和范围
Span
Span 结构表示内存中的一段连续元素,可以用于高效地操作数组的子集而无需复制数据。在示例中,我们创建了一个 Span 对象,然后使用 Slice 方法从索引 2 开始截取长度为 3 的片段,并遍历输出其中的元素。
// 使用 Span
Span<int> numbers = new int[] { 1, 2, 3, 4, 5 };
Span<int> slice = numbers.Slice(2, 3);
foreach (var number in slice)
{Console.WriteLine(number);
}
索引
C# 8 引入了索引特性,^n 表示倒数第 n 个索引。在示例中,我们使用索引特性获取了数组倒数第三个位置的元素并进行输出。
// 索引
int[] array = { 1, 2, 3, 4, 5 };
Index index = ^3; // 表示倒数第三个索引
Console.WriteLine(array[index]); // 输出 3
范围
范围特性用于表示一个从起始索引到结束索引的范围,并常用于切片操作。在示例中,我们创建了一个范围对象表示从索引 1 到索引 4(不包括),然后使用它来获取原数组的子数组,并遍历输出其中的元素。
// 范围
int[] array = { 1, 2, 3, 4, 5 };
Range range = 1..4; // 开始于索引 1,结束于索引 4(不包括)
int[] subArray = array[range]; // 获取指定范围的子数组
foreach (var number in subArray)
{Console.WriteLine(number);
}
处理类型和属性
C#中的反射是指在运行时动态地调查、获取和操作程序集、类型和成员信息的能力。使用反射,你可以在程序运行时获取程序集的元数据,并且可以使用得到的信息来创建对象、调用方法、访问属性等。
1.特性
在C#中,特性(Attribute)是用于为程序实体(如类型、方法、属性等)添加元数据的一种机制。特性允许你声明和使用附加到代码元素上的元数据,以提供关于它们的额外信息。
特性通常以方括号 [] 表示,并可附加到以下内容中:程序集、模块、类、枚举、结构、方法、参数、属性、事件。
2.创建自定义特性
自定义特性是通过创建一个类并继承自 System.Attribute 基类来实现的。在自定义特性类中,你可以定义构造函数和属性来存储特性的元数据信息。通过为自定义特性类添加特定的应用目标(AttributeTargets)和其他约束,可以控制特性可应用的位置和次数。
在使用自定义特性时,你可以在适当的程序实体(如方法、类或者属性)上使用方括号语法将特性应用到它们上面。这样就可以为这些程序实体添加额外的元数据信息,以便在运行时进行检索和使用。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class CustomAttribute : Attribute
{private string description;public CustomAttribute(string description){this.description = description;}public string Description{get { return description; }}
}
public class MyClass
{[Custom("This is a custom attribute")]public void MyMethod(){// 方法内容}
}
3.反射
C#中的反射是一种机制,允许程序在运行时动态地检查类型信息、调用方法和访问属性。通过反射,你可以在程序执行期间获取类型的成员(如字段、方法、属性等)和构造函数的信息,然后基于这些信息来创建对象、调用方法或者修改属性值。
使用 System.Reflection 命名空间中的类,C#提供了丰富的API来支持反射。例如,可以使用 Type 类来获取类型信息,MethodInfo 类来表示方法信息,PropertyInfo 类来表示属性信息等。
反射常用于以下情况:
- 动态加载程序集:允许在运行时从外部文件或网络载入程序集。
- 获取类型信息:可以获取类型的字段、属性、方法等信息。
- 动态创建对象:根据类型来实例化对象。
- 调用方法和属性:可以使用 MethodInfo 和 PropertyInfo 等来动态调用方法和访问属性。
当你使用反射时,可以做到以下几点:
获取类型信息:
Type type = typeof(MyClass);
创建对象实例:
object instance = Activator.CreateInstance(type);
调用方法:
MethodInfo methodInfo = type.GetMethod("MethodName");
methodInfo.Invoke(instance, null);
访问属性:
PropertyInfo propertyInfo = type.GetProperty("PropertyName");
object propertyValue = propertyInfo.GetValue(instance);
总之,C#中的集合和Span、索引、范围以及反射等功能为开发者提供了丰富的工具和技术,帮助他们更高效地处理数据和操作类型信息。通过灵活运用这些功能,开发者可以编写出更加动态和强大的程序。在实际开发中,根据具体的需求和场景,选择合适的集合类型、内存操作方式以及反射机制来实现所需的功能和性能优化是非常重要的。希望本文对你有所帮助,祝愿你在C#编程的道路上越走越远!
相关文章:
C#常见的.Net类型(二)
目录 一、在集合中存储多个对象理解集合的选择1.列表2.字典3.堆栈4.队列5.集 二、使用Span、索引和范围Span索引范围 处理类型和属性1.特性2.创建自定义特性3.反射 一、在集合中存储多个对象 处理集合的常见类型 类型描述List动态大小的数组,可以按索引访问Dictio…...
oracle临时表空间不释放
项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了,临时表空间一直增长,未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…...
Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem
Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…...
科研学习|论文解读——美国政治经济中的权力:网络分析(JASIST, 2019)
论文原题目 Power in the U.S. political economy: A network analysis 摘要 美国政治经济的许多特征产生于大型政治和经济机构之间的互动,然而我们对它们的互动性质和这些机构之间的权力分配知之甚少。在本文中,对总部设在美国的组织的网络进行了详细的…...
常用的git命令
一、常用的git命令 1. 配置 git config --local user.name "xxx" ---仅对当前Git仓库有效。配置信息将保存在当前Git仓库的 .git/config 文件中 local优先级最高,会覆盖其他范围的相同配置 git config --global user.email "xxx" ---全局…...
【AI】用iOS的ML(机器学习)创建自己的AI App
用iOS的ML(机器学习)创建自己的AI App 目录 用iOS的ML(机器学习)创建自己的AI App机器学习如同迭代过程CoreML 的使用方法?软件要求硬件开始吧!!构建管道:设计和训练网络Keras 转 CoreML将模型集成到 Xcode 中结论推荐超级课程: Docker快速入门到精通Kubernetes入门到…...
远程调用初体验笔记
远程调用初体验笔记 微服务架构通常将系统拆分成多个独立的服务单元,每个服务单元都专注于实现特定的业务功能。当一个服务需要使用另一个服务提供的功能时,就可以通过远程调用来实现。 使用步骤 1.步骤 Spring给我们提供了一个RestTemplate工具&#…...
反无人机电子护栏:原理、算法及简单实现
随着无人机技术的快速发展,其在航拍、农业、物流等领域的应用日益广泛。然而,无人机的不规范使用也带来了安全隐患,如侵犯隐私、干扰航空秩序等。为了有效管理无人机,反无人机电子护栏技术应运而生。 目录 一、反无人机电子护栏…...
Java项目利用Redisson实现真正生产可用高并发秒杀功能 支持分布式高并发秒杀
Java中的高并发秒杀场景下我们可以使用redisson来实现高并发秒杀功能, 以下就是一个可用于生产环境的高并发秒杀示例代码: pom依赖 <!-- https://mavenlibs.com/maven/dependency/org.redisson/redisson --><dependency><groupId>org.redisson</groupId&…...
0104行列式的性质-行列式-线性代数
记 D ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ D\begin{vmatrix}a_{11}&a_{12}&\cdots &a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots&&\cdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\en…...
k8s HPA 自动伸缩机制 (配置,资源限制,)
目录 一、概念 核心概念 工作原理 HPA 的配置关键参数 关键组件 使用场景 注意事项 如何确保程序稳定和服务连续 二、metrics-server 部署 metrics-server 准备 metrics-server 镜像: 使用 Helm 安装 metrics-server: 配置 metrics-server: 安装 metrics-server: …...
vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)
GIT-SHELL 沙盒绕过(CVE-2017-8386)导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突,将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa,这是ssh的私钥,连接的时候请指…...
SpringBoot+vue3打造企业级一体化SaaS系统
SpringBootvue3打造企业级一体化SaaS系统 简介: 全面提升前后端技术水平,独立完成全栈项目开发能力,快速进击全栈工程师,最终在面试中脱颖而出。整合后端主流技术(Spring Boot、物理数据库隔离、加载动态权限、多…...
探讨TCP的可靠性以及三次握手的奥秘
🌟 欢迎来到 我的博客! 🌈 💡 探索未知, 分享知识 !💫 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手? 在互联网的复杂世界中,TCP&am…...
openai常见的两个错误:BadRequestError和OpenAIError
错误1:openai.OpenAIError: The api_key client option must be set either by passing api_key..... 在通过openai创建客户端必须要设置api key,如果你事先已经在本机的环境中设置未起效可以手动设置,注意手动设置时不要用下面的形式 import openai f…...
2核4g服务器够用吗?
2核4G服务器够用吗?够用。阿腾云以2核4G5M服务器搭建网站为例,5M带宽下载速度峰值可达640KB/秒,阿腾云以搭建网站为例,假设优化后平均大小为60KB,则5M带宽可支撑10个用户同时在1秒内打开网站,并发数为10&am…...
数据仓库数据分层详解
数据仓库中的数据分层是一种重要的数据组织方式,其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解: 原始数据层(Raw Data Layer):这是数仓中最底层的层级,用于存…...
unity内存优化之AB包篇(微信小游戏)
1.搭建资源服务器使用(HFS软件(https://www.pianshen.com/article/54621708008/)) using System.Collections; using System.Collections.Generic; using UnityEngine;using System;public class Singleton<T> where T : class, new() {private static readonly Lazy<…...
白话模电:3.三极管(考研面试与笔试常考问题)
一、三极管的简单判断 1.判断三极 1)给了图 左边是b,有箭头是e,剩下是c 2)给了电位 b:中间值,e:较近值(离中间值),c:较远值(离中间值) 2.判断流向 bc同向(共同流向“|”或共同流离“|”),e与bc反向 3.判断材料 4.判断类型 5.判断能否构…...
LeetCode 395. 至少有K个重复字符的最长子串
解题思路 一道滑动窗口题型,不过滑动窗口的长度是不同种类元素的个数。 这里需要定义两个变量 cnt,overk。overk表示的是满足大于k的字符数, cnt表示的是该窗口中不同元素的个数且cnt>1&&cnt<26。 相关代码 class Solution {public int longestSub…...
Midjourney锐化效果失效真相(2024官方未公开的渲染管线瓶颈解析)
更多请点击: https://intelliparadigm.com 第一章:Midjourney锐化效果失效真相(2024官方未公开的渲染管线瓶颈解析) 自2024年V6.2版本起,大量用户反馈 --stylize 与 --sharp 参数组合下图像边缘锐化效果显著弱化&am…...
别再只测accuracy!DeepSeek集成测试必须监控的5个隐性指标(P99首token延迟、context bleed率、tool-call schema漂移)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek集成测试的核心范式演进 DeepSeek大模型的工程化落地对集成测试提出了全新挑战:传统基于接口响应码与字段校验的测试范式已难以覆盖语义一致性、推理链鲁棒性、上下文敏感度等高阶质…...
基于ESP32的AIS转WiFi转换器:实现NMEA 0183数据无线传输
1. 项目概述:从VHF-AIS接收器到iPad的无线桥梁作为一名经常在海上折腾电子设备的航海爱好者,我最近遇到了一个挺实际的需求:我的主力导航设备是iPad上的iSailor应用,它功能强大、界面友好,但有个“硬伤”——它需要通过…...
阿波罗登月,不可能:读心术与影子叙事 ——不是向全世界展示登月,而是向全世界注射登月
阿波罗登月,不可能:读心术与影子叙事 ——不是向全世界展示登月,而是向全世界注射登月 Jianbing Zhu 1^{1}1 1^{1}1 ECT-OS-JiuHuaShan 文明实验室 ORCID: 0009-0006-8591-1891 DOI: 10.5281/zenodo.20373157 Email: ect-os-jiuhuashanzoho…...
MeloTTS实战:多语言语音合成的高效解决方案
MeloTTS实战:多语言语音合成的高效解决方案 【免费下载链接】MeloTTS High-quality multi-lingual text-to-speech library by MyShell.ai. Support English, Spanish, French, Chinese, Japanese and Korean. 项目地址: https://gitcode.com/GitHub_Trending/me/…...
MobX社区资源大全:10个必备工具、插件和扩展库推荐 [特殊字符]
MobX社区资源大全:10个必备工具、插件和扩展库推荐 🚀 【免费下载链接】MobX-Docs-CN MobX 中文文档 项目地址: https://gitcode.com/gh_mirrors/mo/MobX-Docs-CN MobX作为一个简单、可扩展的状态管理库,已经成为React开发者不可或缺的…...
如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南
如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地…...
百度深度学习研究院的“叛将“,带着一颗芯片改变了中国智能驾驶——地平线余凯,从ImageNet冠军到征程出货1000万
大家好,我是写代码的篮球球痴。这篇文章跟我自己有点关系——我开的是理想汽车。理想的智驾系统 AD Pro,搭载的就是地平线征程 5 芯片。2026 年 1 月理想 AD Pro 4.0 推送,基于单颗征程 6M 实现了城市 NOA——这是行业里第一个用单颗 128TOPS…...
ModernWMS核心功能详解:从ASN入库到Dispatch出库的完整工作流
ModernWMS核心功能详解:从ASN入库到Dispatch出库的完整工作流 【免费下载链接】ModernWMS The open source simple and complete warehouse management system is derived from our many years of experience in implementing erp projects. We stripped the origin…...
京东自动购物终极指南:告别缺货烦恼,智能抢购神器
京东自动购物终极指南:告别缺货烦恼,智能抢购神器 【免费下载链接】Jd-Auto-Shopping 京东商品补货监控及自动下单 项目地址: https://gitcode.com/gh_mirrors/jd/Jd-Auto-Shopping 还在为心仪商品瞬间售罄而苦恼吗?还在熬夜等待补货却…...
