C# 探险之旅:第十八节 - 元组(Tuple):神奇的背包与丢弃的艺术,还有变身大法!

news2024/12/16 14:30:02

嘿,探险家们!欢迎再次踏上C#的奇妙旅程。今天,我们要聊的是一个非常实用又有点懒散的旅行伴侣——元组(Tuple)。想象一下,你正准备来一场说走就走的旅行,但是不想带太多行李,只想简单打包几件必需品。元组呢,就像是你的那个轻便背包,能让你轻松打包多件物品,而且不用担心超重!

什么是元组?

元组,简单来说,就是一个可以装多个不同类型东西的小包裹。它不像类那样需要定义一堆属性和方法,也不像数组那样只能装同一种类型的东西。元组就像是快餐店里的套餐,你可以自由选择搭配汉堡、薯条、可乐,甚至是甜点,而且它们各自独立,互不干扰。

创建元组的魔法咒语

在C#中,创建元组超级简单,你只需要用一对圆括号(),然后把你想打包的东西用逗号,隔开就行了。比如,你想打包一个整数、一个字符串和一个布尔值,可以这样做:

var myTuple = (1, "Hello, World!", true);

 看,是不是很像你在快餐店点餐时说的:“我要一个汉堡,一份薯条,还有一杯可乐。”?

给元组里的宝贝起名字

虽然元组默认是用Item1Item2这样的名字来访问里面的值,但你也可以给它们起个更亲切的名字。这样,当你从元组里拿东西时,就知道拿的是什么了。

var myNamedTuple = (age: 30, message: "Hello, Named World!", isHappy: true);

Console.WriteLine(myNamedTuple.age);        // 输出: 30
Console.WriteLine(myNamedTuple.message);    // 输出: Hello, Named World!
Console.WriteLine(myNamedTuple.isHappy);    // 输出: True

 是不是感觉像是在给你的旅行物品贴上标签,找起来更方便了呢?

元组的变形记

元组还有个神奇的地方,就是它可以“变形”。什么意思呢?就是你可以根据需要,把元组拆分成更小的部分,或者把几个元组合并成一个更大的元组。

比如,你有一个包含三个元素的元组,但你现在只想拿前两个,可以这样做:

var myTuple = (1, "Hello", true);
var (first, second, third) = myTuple;

Console.WriteLine(first);  // 输出: 1
Console.WriteLine(second); // 输出: Hello

 这就像是你从背包里只拿出了需要的几件东西,剩下的留在了包里。

元组的实际应用

元组在实际编程中非常有用,尤其是当你需要快速返回一个包含多个值的结果时。比如,一个方法需要返回成功或失败的状态码,同时还要返回一些额外的信息,这时候元组就派上用场了。

(int statusCode, string message) GetStatus()
{
    return (200, "Operation Successful!");
}

var result = GetStatus();
Console.WriteLine($"Status Code: {result.statusCode}, Message: {result.message}");

看,是不是既简洁又实用?

对于元组来说,我们还要掌握两项绝技——丢弃(Discard)变身(Switch)

丢弃的艺术:我不要了!

有时候,你从背包里拿出一件东西,但发现你其实并不需要它。这时候,丢弃(Discard)就显得尤为重要了。在C#中,你可以用一个下划线_来表示你不需要的东西。

比如,你只关心背包里的第一个和第三个物品,第二个可以不要:

var myTuple = (1, "I don't need this", true);
var (first, _, third) = myTuple;

Console.WriteLine(first);  // 输出: 1
Console.WriteLine(third);  // 输出: True

看,那个字符串就像被风带走了一样,消失了!这就是丢弃的艺术,让你的代码更加简洁、清晰。

变身大法:元组的终极形态!

接下来,我们要学习的是元组的变身大法——switch表达式与模式匹配。这听起来很神秘,但其实就像是你背包里的物品突然变成了你更需要的东西。

假设你有一个元组,表示一个学生的信息:

var student = (name: "Alice", grade: 90);

现在,你想根据学生的成绩给她一个评价。这时候,你可以使用switch表达式与模式匹配:

string GetGradeEvaluation((string name, int grade) student)
{
    return student.grade switch
    {
        >= 90 => "Excellent!",
        >= 75 => "Good job!",
        >= 60 => "Needs improvement.",
        _ => "Failing."
    };
}

Console.WriteLine(GetGradeEvaluation(student)); // 输出: Excellent!

 看,元组里的grade就像变魔术一样,直接变成了对应的评价!这就是元组的变身大法,让你的代码更加灵活、强大。

 我们具体来分析一下这一段代码:

这里先创建了一个 ValueTuple<string, int> 类型的变量 student,其中 name"Alice"grade90。由于使用了命名元素,你可以通过名字访问这些值,比如 student.namestudent.grade

定义 GetGradeEvaluation 方法,返回值类型为 string

  • 方法签名GetGradeEvaluation 方法接收一个参数 student,它是一个包含 namegrade 的元组。
  • switch 表达式:C# 8.0 引入了 switch 表达式,它比传统的 switch 语句更加简洁和功能强大。在这个例子中,switch 表达式用于根据 student.grade 的值返回不同的字符串。
  • 模式匹配:每个 case 使用了关系模式来比较 student.grade 的值。例如,>= 90 是一个关系模式,它会检查 student.grade 是否大于或等于 90。
  1. 默认情况:如果 student.grade 不符合任何前面的条件,则会匹配 _,这相当于默认情况,表示所有其他情况。
    Console.WriteLine(GetGradeEvaluation(student)); // 输出: Excellent!

    这里将 student 元组传递给 GetGradeEvaluation 方法。

  • 因为 student.grade 是 90,所以 switch 表达式的第一个条件 (>= 90) 成立,因此返回 "Excellent!"
  • Console.WriteLine 打印出这个返回值,即 "Excellent!"

注意事项

  • 代码中的 switch 表达式要求 C# 7.0 或更高版本,因为它使用了关系模式。如果你使用的是较低版本的 C#,你可能需要使用 if-else 或传统的 switch 语句来实现同样的逻辑。
结语:元组的奇幻之旅

探险家们,今天的元组之旅就到这里啦。我们不仅学会了如何打包、命名,还掌握了丢弃的艺术和变身的大法。元组这个神奇的背包,不仅能让你的代码更加简洁、清晰,还能让你的编程之旅更加有趣、充满惊喜。记住,下次当你需要携带多件不同类型的“行李”时,别忘了元组这个好朋友哦!我们下一节再见,继续我们的C#探险之旅!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP软件如何启用反记账功能

SAP软件和国内ERP软件不一样&#xff0c;它在录入会计凭证时是不可以录入负数的&#xff08;即红冲凭证&#xff09;&#xff0c;因此无法直接实现传统意义上的红字冲销。 比如&#xff0c;如下SAP正常和冲销业务产生会计凭证如下&#xff1a; 正常的业务凭证&#xff1a; 借…

若依-帝可得app后端

视频地址 https://www.bilibili.com/video/BV1pf421B71v?t=510.1 APP后端技术栈 架构解析 验证码功能 开发环境使用改的是固定的验证码 12345正式环境使用的是 阿里云的短信方案@Override public void sendSms(String mobile) {// String code = RandomUtil.randomNumbers(5);…

金融分析-Transformer模型(基础理论)

Transformer模型 1.基本原理 transformer的core是注意力机制&#xff0c;其本质就是编码器-解码器。他可以通过多个编码器进行编码&#xff0c;再把编码完的结果输出给解码器进行解码&#xff0c;然后得到最终的output。 1.1编码器 数据在编码器中会经过一个self-attention的…

JS-手写new

我们先再来理一理原型 Object1 {name:deng,age:18 } Object2 {name:ru,age:18 } const Person function(){} Person.prototype Object1; const p1 new Person(); console.log(p1.name); //deng Person.prototype null; console.log(p1.name); //deng上面给Person的构造函…

深圳国威HB1910数字IP程控交换机 generate.php 远程命令执行漏洞复现

0x01 产品描述: 深圳国威主营国威模拟、数字、IP 交换机、语音网关、IP 电话机及各种电话机。深圳国威电子有限公司HB1910是一款功能强大的网络通信设备,适用于各种企业通信需求。 0x02 漏洞描述: 深圳国威电子有限公司HB1910数字IP程控交换机generate.php存在远程命令执行…

机器学习预处理-表格数据的分析与可视化

机器学习预处理-表格数据的分析与可视化 最近在做一些模型部署的工作&#xff0c;但是发现对于数据的处理、分析、训练方面还是缺少一些系统的学习&#xff0c;因此抽空余时间分析总结一些使用python进行数据处理的实用案例&#xff0c;希望能够方便自己已经其他人的Ctrl CV。…

鸿蒙项目云捐助第六讲鸿蒙App应用的首页导航资讯功能的实现

鸿蒙项目云捐助第六讲鸿蒙App应用的首页导航资讯功能的实现 前面的教程中已实现了启动页&#xff0c;登录页&#xff0c;注册页及首页的部分功能。这里有一些朋友提出问题&#xff0c;如何设置登录页面的背景图片。这里稍带说一个这个功能的实现。 一、登录页面的背景图片实现…

【Vue3】前端使用 FFmpeg.wasm 完成用户视频录制,并对视频进行压缩处理

强烈推荐这篇博客&#xff01;非常全面的一篇文章&#xff0c;本文是对该博客的简要概括和补充&#xff0c;在不同技术栈中提供一种可行思路&#xff0c;可先阅读该篇文章再阅读本篇&#xff1a; FFmpeg——在Vue项目中使用FFmpeg&#xff08;安装、配置、使用、SharedArrayBu…

17、ConvMixer模型原理及其PyTorch逐行实现

文章目录 1. 重点2. 思维导图 1. 重点 patch embedding : 将图形分割成不重叠的块作为图片样本特征depth wise point wise new conv2d : 将传统的卷积转换成通道隔离卷积和像素空间隔离两个部分&#xff0c;在保证精度下降不多的情况下大大减少参数量 2. 思维导图 后续再整…

金蝶云苍穹踩过的坑(慢慢更新)

IDEA不能用最新版&#xff0c;不然搜不到金蝶的插件。 我用的是2024.1.7/2023.1.7 IDEA里增加金蝶插件库的地址也变了&#xff0c;现在是 https://tool.kingdee.com/kddt/idea-updatePlugins.xml 金蝶云苍穹部署在服务器 MAC本地IDEA调试的时候&#xff0c;登录N次能成功一次…

springboot438校园志愿者管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园志愿者管理系统信息管理难度大&#xff0c;容错率低&…

高项 - 信息系统管理

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 博文更新参考时间点&#xff1a;2024-11-09 高项 - 章节与知识点汇总&#xff1a;点击跳转 文章目录 高项 - 信息系统管理管理方法管理基础规划和组织设计和实施运维和服务优化和持续改进 管理要点数据管理运维管…

05、GC基础知识

JVM程序在跑起来之后&#xff0c;在数据的交互过程中&#xff0c;就会有一些数据是过期不用的&#xff0c;这些数据可以看做是垃圾&#xff0c;JVM中&#xff0c;这些垃圾是不用开发者管的&#xff0c;它自己会有一套垃圾回收系统自动回收这些内存垃圾&#xff0c;以备后面继续…

【前端开发】HTML+CSS网页,可以拿来当作业(免费开源)

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鲜儿-新鲜、惠民、快捷<…

【Unity3D】无限循环列表(扩展版)

基础版&#xff1a;【Unity技术分享】UGUI之ScrollRect优化_ugui scrollrect 优化-CSDN博客 using UnityEngine; using UnityEngine.UI; using System.Collections.Generic;public delegate void OnBaseLoopListItemCallback(GameObject cell, int index); public class BaseLo…

Git-基础操作命令

目录 Git基础操作命令 case *查看提交日志 log 版本回退 get add . Git基础操作命令 我们创建并且初始化这个仓库以后&#xff0c;我们就要在里面进行操作。 Git 对于文件的增删改查存在几个状态&#xff0c;这些修改状态会随着我们执行Git的命令而发生变化。 untracked、…

Flutter Navigator2.0的原理和Web端实践

01 背景与动机 在Navigator 2.0推出之前&#xff0c;Flutter主要通过Navigator 1.0和其提供的 API&#xff08;如push(), pop(), pushNamed()等&#xff09;来管理页面路由。然而&#xff0c;Navigator 1.0存在一些局限性&#xff0c;如难以实现复杂的页面操作&#xff08;如移…

【容器】k8s学习笔记基础部分(三万字超详细)

概念 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使…

PostgreSQL 常用运维SQL整理

一、查询并杀会话 -- 查询会话 select pid,usename,client_addr,client_port,query_start,query,wait_event from pg_stat_activity; -- 杀会话 select pg_terminate_backend(pid号); -- 使用如下命令自动生成杀会话语句 select datid,datname,pid,usesysid,usename,applicat…

前端0基础用Cursor完成管理系统页面 - 1

Cursor下载 下载链接: https://www.cursor.com/ Hello World! 作为完全不会前端的人&#xff0c;首先需要让AI帮我们搭建一个HelloWorld界面 确定语言框架 首先要给AI框定好前端语言和框架&#xff0c;由于AI的物料大量来自网上的开源项目&#xff0c;所以越是受欢迎的开源…