• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 深入理解C♯ 7.0中的Tuple特性

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

作者:Tony 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Tony 通过本文主要向大家介绍了深入理解c#第3版pdf,clr via c,深入理解c# mobi,c#图解教程,c#高级编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

介绍

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; 
 } 
 } 
}
</div>

根据上述代码片段,该方法返回一个值,该值保存一个名为 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(); 
 } 
 } 
}
</div>

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

图1:输出

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

使用 Class/Struct

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

namespace TupleApp 
{ 
 struct CalculateData 
 { 
 public int Minimum { get; set; } 
 public int Maximum { get; set; } 
 } 
}
</div>

现在,让我们创建另一个名为 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; 
 } 
 } 
}
</div>

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

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(); 
 } 
 } 
}
</div>

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

图2: 输出结果

使用 Tuple

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

图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); 
  } 
 } 
}
</div>

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

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

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(); 
  } 
 } 
}
</div>

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

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

图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); 




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解C♯ 7.0中的Tuple特性
  • 深入理解C# DateTime日期格式化
  • 深入理解C#的数组
  • 深入理解C#中的Delegate
  • 深入理解C#中new、override、virtual关键字的区别
  • 深入理解C#中常见的委托

相关文章

  • 2017-05-28C# 函数覆盖总结学习(推荐)
  • 2017-05-28C#画笔Pen用法实例
  • 2017-05-28c#判断字符是否为中文的三种方法分享(正则表达式判断)
  • 2017-05-28一个可携带附加消息的增强消息框MessageBoxEx
  • 2017-05-28纯C#实现Hook功能详解
  • 2017-05-28解析美国东部时间与北京时间相互转换的实现代码
  • 2017-05-28C#算法函数:获取一个字符串中的最大长度的数字
  • 2017-05-28C#判断系统是32位还是64位的方法
  • 2017-05-28c#获取存储过程返回值示例分享
  • 2017-05-28c# 二分查找算法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 用 C# Winform做出全透明的磨砂玻璃窗体效果代码
    • C#中WinForm程序退出方法技巧总结
    • C# BackgroundWorker组件学习入门介绍
    • 使用C#的aforge类库识别验证码实例
    • C#实现图像反色的方法
    • C#组合模式实例详解
    • C#编程总结(一)序列化总结
    • C#实现获取一年中是第几个星期的方法
    • 深入C#中get与set的详解
    • C#中如何使用 XmlReader 读取XML文件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有