深入理解C♯ 7.0中的Tuple特性

作者:Tony 时间:2023-10-28 09:33:14 

介绍

Tuple是异类对象的有序序列。 我们经常可以写出返回多个值的方法,所以我们需要创建一个包含多个数据元素的简单结构。 为了支持这些情况,Tuple 被添加到 C#。 Tuple 是包含多个字段用来表示数据成员的轻量级数据结构。

如果一个方法返回多个相同类型的数值,那么它可以将这些值存储在一个集合中并返回该集合。 但是如果一个方法需要返回多个不同类型的值呢,C# 提供了一些可选项,比如 Class / Struct,输出参数和 Tuple。

让我们创建一个示例。 我们有一个整数的集合,而且我们需要从这个集合中找出的最小值和最大值。 这时候我们需要创建一个返回最小值和最大值的方法。 为了实现这一点,我们有三个选项:Class / Struct,输出参数和 Tuple。  那么,让我们逐个看看每个选项是如何完成这一功能的。

使用 out 参数

当我们创建一个方法,找出数字序列中的最大值和最小值。 该方法需要将两个值作为最大值和最小值的结果。 因此,我们创建返回值和使用 out 参数作为参数的方法。 返回值保存系列中的最大数,而 out 参数保存系列中的最小数。

让我们创建一个名为 Operation 的类,它实现一个从数字系列中查找最小和最大数的方法。 以下代码段就能实现该功能。


using System.Collections.Generic;

namespace TupleApp
{
class Operation
{
internal int FindMinMax(List<int> list, out int min)
{
 int maximum = int.MinValue, minimum = int.MaxValue;
 list.ForEach(n =>
 {
 minimum = n < minimum ? n : minimum;
 maximum = n > maximum ? n : maximum;
 });
 min = minimum;
 return maximum;
}
}
}

根据上述代码片段,该方法返回一个值,该值保存一个名为 maximum 的整形变量。 该值是该系列的最大值。 此方法将输出参数是名为 min 的参数,该参数保存的是系列中的最小值。

现在,根据下面的代码片段从可执行程序调用此方法。


using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

namespace TupleApp
{
class Program
{
static void Main(string[] args)
{
 List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList();
 int minimum = 0, maximum = 0;
 Operation operation = new Operation();
 maximum = operation.FindMinMax(numbers, out minimum);
 Write($"{minimum} is min and {maximum} is max in {String.Join(",", numbers)}");
 Read();
}
}
}

现在,运行应用程序。 结果如下图所示。

深入理解C♯ 7.0中的Tuple特性

图1:输出

这是正确的方法,但 out 参数并不适合于异步方法。

使用 Class/Struct

还有另一个选项可以从一个方法获取多个值–创建一个具有该数据结构的类或结构体。 我们在这里也执行相同的操作。 我们创建一个名为 CalculateData 的结构体,这个结构体中有两个属性来保存一个系列的最大值和最小值。 以下代码段就是用来创建这个结构体。


namespace TupleApp
{
struct CalculateData
{
public int Minimum { get; set; }
public int Maximum { get; set; }
}
}

现在,让我们创建另一个名为 Operation 的类,它用来实现从数字序列中查找最小值和最大值的方法。 以下代码段就是用来实现这一功能。


using System.Collections.Generic;

namespace TupleApp
{
class Operation
{
internal CalculateData FindMinMax(List<int> list)
{
 int maximum = int.MinValue, minimum = int.MaxValue;
 list.ForEach(n =>
 {
 minimum = n < minimum ? n : minimum;
 maximum = n > maximum ? n : maximum;
 });
 CalculateData data = new CalculateData
 {
 Minimum = minimum,
 Maximum = maximum
 };
 return data;
}
}
}

根据上面的代码片段,该方法返回一个具有两个属性的对象。 这些属性里保存的是系列中的最大值和最小值。
现在,从可执行程序调用此方法,如下面的代码片段所示。


using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

namespace TupleApp
{
class Program
{
static void Main(string[] args)
{
 List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList();
 Operation operation = new Operation();
 CalculateData data = operation.FindMinMax(numbers);
 Write($"{data.Minimum} is min and {data.Maximum} is max in {String.Join(",", numbers)}");
 Read();
}
}
}

现在,运行应用程序。 最终结果如下图所示。

深入理解C♯ 7.0中的Tuple特性

图2: 输出结果

使用 Tuple

C#7 引入了定义元组的新方法。 Tuple 是从方法返回多个值的另一个选择。 它可以保存多个不同类型的值。 要在应用程序中使用 Tuple,我们需要安装 System.ValueTuple NuGet 包.

深入理解C♯ 7.0中的Tuple特性

图3 NuGet 包

我们在这里也执行相同的操作。 让我们创建一个名为 Operation 的类,它实现一个从数字系列中查找最小值和最大数的方法。 以下代码段用来实现该功能。


using System.Collections.Generic;

namespace TupleApp
{
class Operation
{
 internal (int, int) FindMinMax(List<int> list)
 {
  int maximum = int.MinValue, minimum = int.MaxValue;
  list.ForEach(n =>
  {
   minimum = n < minimum ? n : minimum;
   maximum = n > maximum ? n : maximum;
  });
  return (minimum, maximum);
 }
}
}

根据上面的代码片段,该方法返回一个有两个项目的元组。 这些项目保存数字系列的最大值和最小值。

现在,根据下面的代码片段在可执行程序调用这个方法。


using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

namespace TupleApp
{
class Program
{
 static void Main(string[] args)
 {
  List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList();
  Operation operation = new Operation();
  (int, int) data = operation.FindMinMax(numbers);
  Write($"{data.Item1} is min and {data.Item2} is max from {String.Join(",", numbers)}");
  Read();
 }
}
}

根据上面的代码片段,名为 FindMinMax 的方法调用并返回一个元组。 当方法直接返回多个值到一个 Tuple 类型,它们会按照他们的顺序给它们一些默认名称,以便可以方便地调用它们。这元组有两个项目,因此这些项目调用 Item1 和 Item2。 Item1 表示第一个值,而 Item2 表示第二个值。这跟 Tupple 项在创建时使用的顺序相同。

现在,运行应用程序。 最终结果如下图所示。

深入理解C♯ 7.0中的Tuple特性

图4 输出结果

由于 Item1 和 Item2 不表示字段的实际名称,因此我们可以给它们自定义名称。 元组类型变量可以具有自定义名称,而不是仅仅是默认的 Item1 或 Item2。

让我们更新 Operation 类中名为 FindMinMax 的现有方法。 我们为这些元组字段分配自定义名称。 以下代码段用来实现该功能。


using System.Collections.Generic;

namespace TupleApp
{
class Operation
{
 internal (int Minimum, int Maximum) FindMinMax(List<int> list)
 {
  int maximum = int.MinValue, minimum = int.MaxValue;
  list.ForEach(n =>
  {
   minimum = n < minimum ? n : minimum;
   maximum = n > maximum ? n : maximum;
  });
  return (minimum, maximum);
 }
}
}

这里,元组的第一个字段名称为 Minimum,而另一个字段名为 Maximum。

现在,根据下面的代码片段从可执行程序调用此方法。


using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

namespace TupleApp
{
class Program
{
 static void Main(string[] args)
 {
  List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList();
  Operation operation = new Operation();
  var data = operation.FindMinMax(numbers);
  Write($"{data.Minimum} is min and {data.Maximum} is max from {String.Join(",", numbers)}");
  Read();
 }
}
}

名为 FindMinMax 的方法调用并返回一个元组。 该元组有两个项目,根据元组项目的顺序称为最小值和最大值。

现在,运行应用程序并查看结果。

深入理解C♯ 7.0中的Tuple特性

图5 输出结果

结论

Tuple 是异类对象的有序序列。 当一个方法需要返回多个值的时候使用它。Tuple 实例的条目数是固定的。Tuple 有最大数目为 8 项的限制。 如果我们想创建一个带有更多项的 Tuple,我们必须创建嵌套的 Tuple。 Tuple 的第八项必须是另一个 Tuple。

来源:https://www.oschina.net/translate/tuple-in-c-sharp-7

标签:c#7,tuple特性
0
投稿

猜你喜欢

  • 实现qq中按返回键返回桌面不退出程序的实例

    2022-07-14 16:14:05
  • C#制作鹰眼的详细全过程(带注释)实例代码

    2022-03-01 06:56:12
  • 如何在c语言下关闭socket

    2021-12-26 10:22:46
  • IDEA查看Scala的源码的教程图解

    2023-12-13 22:50:45
  • IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法

    2021-11-09 11:06:53
  • Java Filter 过滤器详细介绍及实例代码

    2023-11-26 01:04:39
  • Spring Cloud 整合 nacos实现动态配置中心的详细步骤

    2023-01-19 18:15:00
  • 详解android 中animation-list 动画的应用

    2022-09-13 18:28:31
  • MyBatis的逆向工程详解

    2022-12-03 11:06:10
  • Struts2返回json格式数据代码实例

    2023-10-12 13:15:32
  • Java性能优化技巧汇总

    2023-01-05 16:26:31
  • Java对XML文件增删改查操作示例

    2021-10-28 08:46:29
  • Jquery+Ajax+Json+存储过程实现高效分页

    2022-04-25 02:22:30
  • C#微信开发之微信公众号标签管理功能

    2023-04-17 20:20:44
  • Springboot启动执行特定代码的方式汇总

    2023-08-06 04:42:24
  • Spring Data Jpa 复杂查询方式总结(多表关联及自定义分页)

    2023-11-21 10:01:27
  • java中最易犯错的特殊字符示例详解

    2022-09-27 17:51:08
  • Spring Boot中使用Redis实战案例

    2021-06-03 04:17:04
  • Java创建子线程的两种方法

    2023-11-24 07:00:05
  • Java中clone方法使用笔记

    2023-03-26 07:44:38
  • asp之家 软件编程 m.aspxhome.com