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

ops/2024/12/16 3:31:54/

嘿,探险家们!欢迎再次踏上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.ppmy.cn/ops/142276.html

相关文章

Docker 安装 Jenkins:2.346.3

准备&#xff1a;已安装Docker&#xff0c;已配置服务器安全组规则 1581 1、拉取镜像 [rootTseng ~]# docker pull jenkins/jenkins:2.346.3 2.346.3: Pulling from jenkins/jenkins 001c52e26ad5: Pull complete 6b8dd635df38: Pull complete 2ba4c74fd680: Pull complet…

7.Pandas快速入门

一、引入工具模块 import numpy as np #科学计算模块 import pandas as pd #数据处理和数据分析模块 import Matplotlib as #数据可视化模块 二、读取数据 df pd.read_excel(....) df pd.read_csv(....) df pd.read.table(....) ...... 三、查看数…

Jenkins自动化部署前端项目

Jenkins部署指南参考小黄另一篇文章 Jenkins部署Java项目 实现功能 通过gitlab合并方式&#xff0c;触发jenkins构建指令&#xff0c;构建uat分支上的代码&#xff0c;构建完成后&#xff0c;发送到另一台服务器的目录下。 配置Node 在插件市场中安装NodeJS Plugin后&#xff…

鸿蒙开发:一个轻盈的上拉下拉刷新组件

前言 老早之前开源了一个刷新组件&#xff0c;提供了很多常见的功能&#xff0c;也封装了List&#xff0c;Grid&#xff0c;WaterFlow&#xff0c;虽然功能多&#xff0c;但也冗余比较多&#xff0c;随着时间的前去&#xff0c;暴露的问题就慢慢增多&#xff0c;虽然我也提供了…

Android Studio更改项目使用的JDK

一、吐槽 过去&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 原本可以在这修改JDK: 但大家都知道&#xff0c;Android Studio的狗屎性能&#xff0c;再加…

服务器数据恢复—热备盘上线过程中硬盘离线导致raid5阵列崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 两组分别由4块SAS接口硬盘组建的raid5阵列&#xff0c;两组raid5阵列划分LUN并由LVM管理&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; RAID5阵列中一块硬盘未知原因离线&#xff0c;热备盘自动激活上线替换离线硬盘。在热备盘上…

防范TCP攻击:策略与实践

TCP&#xff08;传输控制协议&#xff09;是互联网通信的核心协议之一&#xff0c;它确保了数据在网络上的可靠传输。然而&#xff0c;TCP也容易成为各种网络攻击的目标&#xff0c;如SYN洪水攻击、TCP连接耗尽攻击等。本文将探讨如何通过配置防火墙规则、优化服务器设置以及采…

docker 发布 net5 教程

基于已经打包好程序 1. 在/home/ 建立目录 cd /home/ mkdir netcore2.把已打包好项目文件上传到该目录 3.创建 Dockerfile cd netcore vi Dockerfile 4. 写入以下内容到Dockerfile #注意 COPY . /app 之间都有空格 # EXPOSE xxx 暴露端口 FROM mcr.microsoft.com/dotn…