元组(Tuple)详解——c#
在C#中,元组(Tuple) 是一种轻量级的数据结构,用于将多个值组合成一个单一的对象。元组非常适合在不需要定义新类或结构体的情况下,临时存储和传递多个相关的值。
C# 中的元组有两种形式:
-
传统元组(
System.Tuple):C# 4.0 引入,元素通过Item1,Item2等属性访问。 -
值元组(
System.ValueTuple):C# 7.0 引入,性能更高,支持更灵活的语法。
一、传统元组(System.Tuple)
1. 定义和使用
传统元组是引用类型,定义时需要指定每个元素的类型。
// 定义一个包含两个元素(int 和 string)的元组
Tuple<int, string> person = new Tuple<int, string>(1, "Alice");// 访问元组中的元素
Console.WriteLine($"ID: {person.Item1}, Name: {person.Item2}");
// 输出:ID: 1, Name: Alice
2. 支持的最大元素数量
传统元组最多支持 8 个元素。如果需要更多元素,可以使用嵌套元组。
// 定义一个包含 8 个元素的元组 var data = new Tuple<int, int, int, int, int, int, int, Tuple<string>>( 1, 2, 3, 4, 5, 6, 7, new Tuple<string>("Eight") ); // 访问第 8 个元素 Console.WriteLine(data.Rest.Item1); // 输出:Eight
二、值元组(System.ValueTuple)
1. 定义和使用
值元组是值类型,性能更高,语法更简洁。C# 7.0 引入了更友好的语法支持。
// 定义一个包含两个元素(int 和 string)的值元组
(int Id, string Name) person = (1, "Alice");// 访问元组中的元素
Console.WriteLine($"ID: {person.Id}, Name: {person.Name}");
// 输出:ID: 1, Name: Alice
2. 命名元素
值元组支持为元素命名,使代码更具可读性。
// 定义时命名元素
var person = (Id: 1, Name: "Alice");// 访问命名元素
Console.WriteLine($"ID: {person.Id}, Name: {person.Name}");
// 输出:ID: 1, Name: Alice
3. 解构元组
可以将元组解构为多个变量。
// 定义元组
var person = (Id: 1, Name: "Alice");// 解构元组
(int id, string name) = person;Console.WriteLine($"ID: {id}, Name: {name}");
// 输出:ID: 1, Name: Alice
4. 作为方法返回值
元组非常适合用于返回多个值的方法。
// 返回元组的方法
(int, string) GetPerson()
{return (1, "Alice");
}// 调用方法并解构返回值
var (id, name) = GetPerson();
Console.WriteLine($"ID: {id}, Name: {name}");
// 输出:ID: 1, Name: Alice
三、传统元组 vs 值元组
| 特性 | 传统元组(System.Tuple) | 值元组(System.ValueTuple) |
|---|---|---|
| 类型 | 引用类型 | 值类型 |
| 性能 | 较低(堆分配) | 较高(栈分配) |
| 元素命名 | 不支持 | 支持 |
| 解构支持 | 不支持 | 支持 |
| 最大元素数量 | 8(可嵌套扩展) | 任意 |
| 语法简洁性 | 较繁琐 | 更简洁 |
四、元组的应用场景
-
返回多个值:
-
无需定义新的类或结构体,直接返回多个值。
(int Min, int Max) FindMinMax(int[] numbers) {return (numbers.Min(), numbers.Max()); } -
-
临时组合数据:
-
在不需要定义新类型的情况下,临时组合多个数据。
var point = (X: 10, Y: 20);
-
-
解构数据:
-
从元组中提取数据并赋值给多个变量。
var (x, y) = point;
-
-
简化代码:
-
减少不必要的类定义,使代码更简洁。
var person = (Id: 1, Name: "Alice", Age: 30);
-
-
五、完整示例代码
以下是一个完整的示例,展示了传统元组和值元组的定义、使用和解构:
using System;class Program {static void Main(){// 传统元组var oldTuple = new Tuple<int, string>(1, "Alice");Console.WriteLine($"传统元组: ID={oldTuple.Item1}, Name={oldTuple.Item2}");// 值元组(int Id, string Name) newTuple = (1, "Alice");Console.WriteLine($"值元组: ID={newTuple.Id}, Name={newTuple.Name}");// 解构元组var (id, name) = newTuple;Console.WriteLine($"解构元组: ID={id}, Name={name}");// 返回元组的方法var result = GetPerson();Console.WriteLine($"方法返回元组: ID={result.Id}, Name={result.Name}");}// 返回元组的方法static (int Id, string Name) GetPerson(){return (1, "Alice");} }六、总结
-
元组 是一种轻量级的数据结构,适合临时存储和传递多个值。
-
传统元组 是引用类型,语法较繁琐。
-
值元组 是值类型,性能更高,语法更简洁,支持命名元素和解构。
-
在 C# 7.0 及以上版本中,推荐使用值元组。
相关文章:
元组(Tuple)详解——c#
在C#中,元组(Tuple) 是一种轻量级的数据结构,用于将多个值组合成一个单一的对象。元组非常适合在不需要定义新类或结构体的情况下,临时存储和传递多个相关的值。 C# 中的元组有两种形式: 传统元组…...
串口通信函数汇总-ing
谢谢各位佬的阅读,本文是我自己的理解,如果您发现错误,麻烦请您指出,谢谢 首先谈谈我自己对于串口的理解,随便拿一个嵌入式的板子,它上面有两个引脚,一个是rx,一个是tx,r…...
01.Kubernetes 概述
Kubernetes 概述 Kubernetes 概述1. Kubernetes系统组件、集群及工作机制1.1 Kubernetes 集群的节点类型1.2 Kubernetes 集群架构1.2.1 API Server1.2.2 Cluster Store (etcd)1.2.3 Controller Manager1.2.4 Scheduler1.2.5 Kubelet1.2.6 Kube Proxy 1.3…...
十种处理权重矩阵的方法及数学公式
1. 权重归一化(Weight Normalization) 目的:通过分离权重向量的范数和方向来加速训练。公式:对于权重向量 w \mathbf{w} w,归一化后的权重 w ′ \mathbf{w} w′ 为: w ′ w ∥ w ∥ \mathbf{w} \frac{…...
JVM垃圾回收面试题及原理
1. 对象什么时候可以被垃圾器回收 如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收 如果要定位什么是垃圾,有两种方式来确定 引用计数法可达性分析算法 1.1 …...
Flutter 小技巧之通过 MediaQuery 优化 App 性能
许久没更新小技巧系列,温故知新,在两年半前的《 MediaQuery 和 build 优化你不知道的秘密》 我们聊过了在 Flutter 内 MediaQuery 对应 rebuild 机制,由于 MediaQuery 在 MaterialApp 内,并且还是一个 InheritedWidget ࿰…...
操作系统知识点23
1.实时操作系统的主要设计目标:在严格时间氛围内对外部请求做出反应。 2.当用户程序正在处理器上运行时,若此刻取到了一条特权指令,则处理器将停止执行该指令,并产生一个“非法操作”的事件 3.某网络监控系统中。多个被授权的用…...
【解决报错】:detected dubious ownership in repository at ‘D:/idea_code/xxx‘问题
解决报错:detected dubious ownership in repository at D:/idea_code/xxx‘问题 git config --global --add safe.directory *原因 这个错误提示表明 Git 检测到仓库的所有权存在问题,仓库的所有者与当前用户不匹配。Git 在 2.35.2 版本之后引入了一个…...
三角函数:从宇宙法则到AI革命的数学密钥
——跨越三千年的数学语言与现代科技全景透视 一、数学本质:宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化,其数学表达可抽象为: { x cos θ ℜ ( e i θ ) y sin θ ℑ ( e i θ ) \begin…...
SpringBoot基础Kafka示例
这里将生产者和消费者放在一个应用中 使用的Boot3.4.3 引入Kafka依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…...
Spring 的三种注入方式?
1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下。 1.1 属性注入 属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下&#x…...
STM32第一天建立工程
新建一个工程 1:新建一个文件,添加文件 a:DOC工程说明 》doc说明文档 b:Libraries固件库 》cmsis内核文件 (一般这就是stm32内核文件) 》FWLIB外设文件 (这种就是stm32外设文件不全) 》start…...
记录一下返修
1.对复杂度的分析还不够; 2.融合两种指标的解释还不够,审稿人认为这两种指标存在冲突,不能同时优化,但其实我们考虑的是公平性保证整个调度周期内用户分配到了更加平均的sum-rate,而se是为了追求每个调度时刻都尽可能找到信道条件…...
搭建本地化笔记AI:用Copilot+deepseek+nomic-embed-text构建本地智能知识系统
安装Ollama https://ollama.com/ 下载模型 下载大语言模型 根据自己电脑的配置选择模型的大小 ollama run deepseek-r1:8b 下载向量处理模型 创建向量数据库时需要使用Embedding模型对文本进行向量化处理 ollama pull nomic-embed-text 查看安装的模型 ollama listNAME …...
【C语言】指针篇
目录 C 语言指针概述指针的声明和初始化声明指针初始化指针 指针的操作解引用操作指针算术运算 指针的用途动态内存分配作为函数参数 指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针 函数指针函数指针的定义和…...
【蓝桥杯单片机】第十一届省赛
一、真题 二、创建工程 1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名 3.选择对应的芯片型号 4.选择否,即不创建启动文件 …...
【存储中间件】Neo4J图数据库超详细教程(一):相关介绍、特点及优势、数据模型、软件安装
文章目录 Neo4J超详细教程一、Neo4J相关介绍1.为什么需要图数据库方案1:Google方案2:Facebook 2.特点和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 个人主页:道友老李 欢迎加入社区:道友老李…...
xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱
XXL-JOB XXL-JOB是一个分布式任务调度平台(XXL是作者徐雪里姓名拼音的首字母),其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 源码仓库地址:https://github.com/xuxueli/xxl-job 源码结构: 系统架构 在xxl-j…...
【QT】QScrollBar设置样式:圆角、隐藏箭头、上边距等
目录 0.简介 1.原理 2.具体代码 0.简介 环境:Ubuntu22.04、qtDesigner绘制UI 项目需要,按照UI修改滚动条样式,滚动条我使用的是QScrollBar,默认样式和修改之后的样式如下: 1.原理 2.具体代码 我是用qtDesigner绘制…...
trae中文版AI搭建完整可用的项目框架
Trae 是由字节跳动推出的 AI 原生集成开发环境(AI IDE),号称可以搭建完整项目,个人试用后体验确实比Cursor或cline更便捷,因为他多个文件关联准确率更高。 正式版的trae不支持大陆使用,不过目前已经推出了…...
多数元素——面试经典150题(力扣)
题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3 …...
cfi网络安全 网络安全hcip
目录 RIP (路由信息协议) 算法 开销 版本 开销值的计算方式 RIPV1和RIPV2的区别 RIP的数据包 Request(请求)包 Reponse(应答)包 RIP的特征 周期更新 RIP的计时器 1,周期更新计时器 2,失效计时器 3,垃圾回收计时器 RIP的核心思…...
Banana Pi 与瑞萨电子携手共同推动开源创新:BPI-AI2N
2025年3月11日, Banana Pi 开源硬件平台很高兴宣布,与全球知名半导体解决方案供应商瑞萨电子(Renesas Electronics)正式达成技术合作关系。此次合作标志着双方将在开源技术、嵌入式系统和物联网等领域展开深度合作,为全…...
linux 命令 ls
ls 是 Linux 系统中用于列出目录内容的核心命令,几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时,默认列出当前目录的内容。 可以指定文件或目录路径,支持通配符(如…...
论数组去重之高效方法
论数组去重之高效方法 数组去重的高效方法主要有 利用 Set 数据结构、利用对象/Map哈希表、排序后遍历去重 三种核心方案。其中 Set 是ES6最简单高效的方式,时间复杂度为 O(n);若需兼容性优化或处理特殊数据类型,可结合哈希表或排序实现。 分点论述: 1. 使用 Set 数据结构…...
C#-扩展方法-Linq
密封类 sealed,无法被继承 var 可以定义匿名对象 static void test1() {var t 1;t "jack";//报错,类型已经确定好了var s new{id 1,name "tom"};Console.WriteLine(s.id s.name); } 扩展方法 对现有类型做方法的扩展&am…...
【C++ STL】 容器详解:pair 学习
在 C STL(标准模板库)中,pair 是一个 简单的键值对数据结构,用于存储 两个相关联的值,将两个值组合成一个单元,可以是相同或不同类型。它常用于 返回多个值、存储映射关系、排序 等场景。 1. pair 的基本特…...
Go红队开发—web网络编程
文章目录 web网络编程Req快速请求 调试DevModeDebugLogTraceInfo瓶颈分析 控制请求与响应控制请求的字段内容控制调试打印的内容分开dump请求与响应部分请求体设置 作用范围级别设置参数查询URL 路径参数表单请求设置请求头设置 判断响应状态码解析数据SetSuccessResultgjson响…...
libwebsockets实现异步websocket客户端,服务端异常断开可重连
libwebsockets websocket客户端基本流程网上都有,我只额外优化了重连机制。 在服务器异常断开时不触发LWS_CALLBACK_CLOSED或LWS_CALLBACK_CLIENT_CONNECTION_ERROR,导致无法自动重连 通过定时检查链接是否可写入判断链接是否有效 // 判断wsi是否可用if …...
轻量级模块化前端框架:快速构建强大的Web界面
轻量级模块化前端框架:快速构建强大的Web界面 在当今快节奏的Web开发环境中,选择一个高效且灵活的前端框架至关重要。UIkit 是一个轻量级的模块化前端框架,旨在帮助开发者快速构建功能强大且响应迅速的Web界面。 UIkit提供了丰富的组件和工…...
