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# WPF中如何自定义MarkupExtension

    首先,需要了解什么是MarkupExtension。在C# WPF开发中,MarkupExtension是一种特殊的对象,可以用于扩展XAML标记语言,以实现更为灵活的UI布局和自定义功能。 在C# WPF中,自定义MarkupExtension的步骤如下: 创建类并继承自MarkupExtension类。 public class MyExtension …

    C# 2023年6月6日
    00
  • Java和C#下的参数验证方法

    下面是Java和C#下的参数验证方法的完整攻略: Java下的参数验证方法 在Java中,参数验证通常使用JSR 303/349 Bean Validation规范的注解实现。通过在实体类的属性上标注对应的注解,可以对参数进行各种验证,比如非空、长度、格式等等。这些注解在Java Bean Validation API中已经定义好了。 下面是示例代码: im…

    C# 2023年6月6日
    00
  • asp.net 截取Http请求的实现代码

    当我们需要对Http请求做一些特殊的处理时,我们可能需要截取Http请求。在ASP.NET中,我们可以通过编写HttpModule和HttpHandler来实现对Http请求的截取。 HttpModule实现截取Http请求 1.创建HttpModule 首先,我们需要创建一个继承自System.Web.IHttpModule接口的类。该接口具有两个方法:I…

    C# 2023年5月31日
    00
  • C++与C#互调dll的实现步骤

    C++与C#互调dll的实现步骤包括以下几个步骤: 编写C++ DLL文件 将C++ DLL文件导出为C风格的函数 创建一个C#类封装DLL中的函数 定义DllImport引入C++ DLL中的函数 使用C#类中的方法调用C++ DLL中的函数 下面是详细的实现步骤以及两个示例: 编写C++ DLL文件 使用Visual Studio创建一个Win32项目,…

    C# 2023年5月15日
    00
  • C# Linq的Select()方法 – 将序列中的每个元素投影到新形式中

    C# Linq中的Select()是一个用于在查询中选择特定数据,提取它们并创建新的数据结构的方法。该方法可以将集合、列表、数组等多种数据类型中的数据进行选择、投影、转换和过滤,在实际应用中非常实用。下面是详细讲解C#Linq的Select()的完整攻略: 一、Select()简介 Select()方法是Linq中最常用的方法之一,用于对序列中的每个元素应用…

    C# 2023年4月19日
    00
  • linq中的串联操作符

    当我们需要将多个序列串联在一起时,可以使用 LINQ 串联操作符。串联操作符包括 Concat 和 Union 。 Concat 操作符 Concat 操作符用于将两个序列按照顺序连接在一起,生成一个新序列。新序列包含原始序列中所有元素,包括重复元素。 Concat 操作符的语法如下: var result = sequence1.Concat(sequen…

    C# 2023年6月8日
    00
  • C# File.Copy(string sourceFileName, string destFileName):复制指定文件

    File.Copy(string sourceFileName, string destFileName)方法是C#中的一个文件操作方法,其主要作用是将一个已存在的文件复制到一个新的文件中。该方法的语法如下: public static void Copy(string sourceFileName, string destFileName); 该方法有两个…

    C# 2023年4月19日
    00
  • Asp.Net Core中WebSocket绑定的方法详解

    Asp.Net Core中WebSocket绑定的方法详解 WebSocket是一种在Web应用程序中实现双向通信的协议。在Asp.Net Core中,我们可以使用WebSocket来实现实时通信。本攻略将介绍如何在Asp.Net Core中使用WebSocket,并提供两个示例说明。 WebSocket绑定的方法 在Asp.Net Core中,我们可以使用…

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