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…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
