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…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
