C#元组类型ValueTuple用法详解

C#元组类型ValueTuple用法详解

简介

元组类型是C#7.0之后加入的新特性,提供了一种简单方便的方式来存储和传递多个值。元组类型有两种:ValueTupleTuple

本篇攻略将详细讲解ValueTuple类型的用法。

ValueTuple类型的定义

ValueTuple是一个泛型结构体(struct),它所定义的元组类型可以存储1~8个元素,如下:

ValueTuple<int> tuple1 = ValueTuple.Create(1);
ValueTuple<int, string> tuple2 = ValueTuple.Create(1, "hello");
ValueTuple<int, string, bool> tuple3 = ValueTuple.Create(1, "hello", true);
ValueTuple<int, string, bool, char> tuple4 = ValueTuple.Create(1, "hello", true, 'a');
ValueTuple<int, string, bool, char, double> tuple5 = ValueTuple.Create(1, "hello", true, 'a', 3.14);
ValueTuple<int, string, bool, char, double, float> tuple6 = ValueTuple.Create(1, "hello", true, 'a', 3.14, 6.28f);
ValueTuple<int, string, bool, char, double, float, decimal> tuple7 = ValueTuple.Create(1, "hello", true, 'a', 3.14, 6.28f, 1.618m);
ValueTuple<int, string, bool, char, double, float, decimal, long> tuple8 = ValueTuple.Create(1, "hello", true, 'a', 3.14, 6.28f, 1.618m, 9223372036854775807);

ValueTuple类型的赋值和访问

赋值方式

元组类型的赋值方式与数组类似,可以通过下标或名称来赋值:

ValueTuple<int, string, bool> tuple = ValueTuple.Create(1, "hello", true);
tuple.Item1 = 2;
tuple.Item2 = "world";
tuple.Item3 = false;

也可以通过解构赋值方式来给元素赋值:

(int t1, string t2, bool t3) = tuple;
t1 = 2;
t2 = "world";
t3 = false;

访问方式

可以通过Item1、Item2等属性或者解构方式来访问元组元素:

int t1 = tuple.Item1;
string t2 = tuple.Item2;
bool t3 = tuple.Item3;

(int t4, string t5, bool t6) = tuple;

ValueTuple类型作为函数返回值

ValueTuple类型还可以作为函数的返回值,不仅可以返回单个值,也可以返回多个值:

static (int, string, bool) GetValues()
{
    int t1 = 1;
    string t2 = "hello";
    bool t3 = true;

    return (t1, t2, t3);
}

static (int, string) GetValues2()
{
    int t1 = 1;
    string t2 = "hello";

    return (t1, t2);
}

ValueTuple类型作为函数参数

ValueTuple类型也可以作为函数的参数传递:

static void SetValues((int, string, bool) tuple)
{
    Console.WriteLine($"Item1: {tuple.Item1}, Item2: {tuple.Item2}, Item3: {tuple.Item3}");
}

调用方式如下:

var tuple = (1, "hello", true);
SetValues(tuple);

示例说明

示例1:使用ValueTuple类型返回坐标

编写一个函数,该函数接收一个点的x和y坐标值,返回一个ValueTuple类型的元组,其中第1个元素为x坐标,第2个元素为y坐标。

static (int, int) GetPoint(int x, int y)
{
    return (x, y);
}

函数调用:

var point = GetPoint(1, 2);
Console.WriteLine($"x: {point.Item1}, y: {point.Item2}");

输出结果:

x: 1, y: 2

示例2:使用ValueTuple类型返回课程成绩统计信息

编写一个函数,该函数接收一个数组,数组中的每个元素为一个元组,包含学生姓名、语文分数、数学分数、英语分数。函数返回一个ValueTuple类型的元组,其中第1个元素为所有学生的平均分,第2个元素为语文分数最高的学生姓名,第3个元素为数学分数最高的学生姓名,第4个元素为英语分数最高的学生姓名。

static (double, string, string, string) GetScores((string Name, int Chinese, int Math, int English)[] scores)
{
    double avg = (double)scores.Sum(s => s.Chinese + s.Math + s.English) / scores.Length;

    var chineseMax = scores.Max(s => s.Chinese);
    var mathMax = scores.Max(s => s.Math);
    var englishMax = scores.Max(s => s.English);

    var chineseName = scores.First(s => s.Chinese == chineseMax).Name;
    var mathName = scores.First(s => s.Math == mathMax).Name;
    var englishName = scores.First(s => s.English == englishMax).Name;

    return (avg, chineseName, mathName, englishName);
}

函数调用:

var scores = new[]
{
    ("张三", 80, 90, 85),
    ("李四", 90, 75, 95),
    ("王五", 85, 80, 90),
    ("赵六", 85, 85, 80)
};
var result = GetScores(scores);

Console.WriteLine($"平均分:{result.Item1}");
Console.WriteLine($"语文最高分学生:{result.Item2}");
Console.WriteLine($"数学最高分学生:{result.Item3}");
Console.WriteLine($"英语最高分学生:{result.Item4}");

输出结果:

平均分:83.75
语文最高分学生:李四
数学最高分学生:张三
英语最高分学生:李四

结语

本篇攻略详细讲解了ValueTuple类型的定义、赋值和访问、作为函数返回值和参数,同时也提供了两个示例说明。ValueTuple类型非常方便,可以使代码更加简洁易懂。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#元组类型ValueTuple用法详解 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#打印绘图的实现方法

    C#可以使用绘图技术实现各种详细复杂的图形和文本,可以在窗体、控件等多个对象上进行绘制。这里提供一份“C#打印绘图的实现方法”的攻略供您参考。 1. 打印机 在使用 C# 绘制和打印图表之前,需要获得系统安装的可用打印机列表,以便用户选择要打印作业的打印机。通过 System.Drawing.Printing.PrinterSettings.Installe…

    C# 2023年6月1日
    00
  • C#实现简单的Login窗口实例

    请看下面的详细讲解。 C#实现简单的Login窗口实例 一、需求分析 在设计Login窗口时,需要实现以下功能: 输入用户名和密码; 点击“登录”按钮,系统验证用户名和密码是否正确; 如果正确,则跳转到主界面; 如果错误,则显示提示信息。 二、设计思路 根据需求分析,我们可以将Login窗口分为三个部分: 用户名和密码输入框; 登录按钮; 提示信息。 进一步…

    C# 2023年6月7日
    00
  • 深入多线程之:Reader与Write Locks(读写锁)的使用详解

    《深入多线程之:Reader与Write Locks(读写锁)的使用详解》是一篇介绍Java并发编程中读写锁的文章。文章深入浅出地介绍了读写锁的基本概念、原理、使用场景及使用方式,并附有具体的示例说明。下面我将详细介绍本文的主要内容。 1. 什么是读写锁 读写锁是一种特殊的锁,它与常规的互斥锁不同,读写锁允许多个线程同时读共享变量,但对该共享变量进行写操作时…

    C# 2023年6月3日
    00
  • 微信跳一跳自动脚本C#代码实现

    标题: 微信跳一跳自动脚本C#代码实现 介绍:本文主要讲解如何使用C#代码实现微信跳一跳自动脚本,可以自动完成跳跃并获得高分。 步骤:1. 准备工作:安装Visual Studio、Android手机模拟器及ADB驱动;2. 安装ADB驱动:将手机连接到电脑,安装对应的ADB驱动;3. 获取跳一跳的截屏:使用ADB命令获取手机屏幕截图; adb shell …

    C# 2023年6月6日
    00
  • Unity3D 单例模式和静态类的使用详解

    《Unity3D单例模式和静态类的使用详解》是一篇介绍Unity3D中单例模式和静态类的文章。在Unity3D中,单例模式和静态类都是非常常用的设计模式,它们可以帮助我们更好地管理游戏对象和数据,提高代码的可维护性和可扩展性。 1. 单例模式的使用 1.1 单例模式的定义 单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供全局访问点。 1.…

    C# 2023年5月15日
    00
  • ASP.NET Core – 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比,分布式缓存具有多个优势。 当分发缓存数据时,数据: 在多个服务器的请求之间保持一致(一致性)。 在进行服务器重…

    C# 2023年4月19日
    00
  • C#使用NPOI对word进行读写

    我来讲解一下“C#使用NPOI对word进行读写”的完整攻略。 1. NPOI简介 NPOI是一款开源的.NET控件库,用于读写Excel、Word和PowerPoint文档。它是兼容OOXML格式文档的,并使用了一套高效的处理方式,使得在.NET平台上读写Office文档的效率得到大幅提升。 2. 安装NPOI 首先需要在Visual Studio中安装N…

    C# 2023年5月31日
    00
  • C#实现的简单验证码识别实例

    下面是针对C#实现简单验证码识别的完整攻略: 1. 获取验证码图片 首先,需要下载验证码图片并将其保存到本地。可以使用下面的代码来实现: var webClient = new WebClient(); webClient.DownloadFile("http://example.com/captcha.png", "captc…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部