`
wyf
  • 浏览: 425297 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

C#7.0新增元组

    博客分类:
  • C#
阅读更多

定义:

//此赋值会创建其成员为 Item1 和 Item2 的元组,其使用方式与 Tuple 的相同。
var letters = ("a", "b");

//namedLetters 元组包含称为 Alpha 和 Beta 的字段。
(string Alpha, string Beta) namedLetters = ("a", "b");

//还可以指定赋值右侧的字段的名称
var alphabetStart = (Alpha: "a", Beta: "b");

//生成警告 CS8123,告知你赋值右侧的名称 Alpha 和 Beta 将被忽略,
//因为它们与左侧的名称 First 和 Second 冲突。
(string First, string Second) firstLetters = (Alpha: "a", Beta: "b");

 使用

元组在作为 private 和 internal 方法的返回类型时是最有用的。 元组为这些方法提供了简单的语法以返回多个离散值:不用再费心创作定义返回类型的 class 或 struct 无需创建新类型。

public static double StandardDeviation(IEnumerable<double> sequence)
{
    (int Count, double Sum, double SumOfSquares) computation = ComputeSumsAnSumOfSquares(sequence);

    var variance = computation.SumOfSquares - computation.Sum * computation.Sum / computation.Count;
    return Math.Sqrt(variance / computation.Count);
}

private static (int Count, double Sum, double SumOfSquares) ComputeSumsAnSumOfSquares(IEnumerable<double> sequence)
{
    var computation = (count: 0, sum: 0.0, sumOfSquares: 0.0);

    foreach (var item in sequence)
    {
        computation.count++;
        computation.sum += item;
        computation.sumOfSquares += item * item;
    }

    return computation;
}

 

析构

//1
 (int count, double sum, double sumOfSquares) = ComputeSumAndSumOfSquares(sequence);
//2
var (sum, sumOfSquares, count) = ComputeSumAndSumOfSquares(sequence);
//3
(double sum, var sumOfSquares, var count) = ComputeSumAndSumOfSquares(sequence);
//4析构赋值
public class Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y) => (X, Y) = (x, y);
}

 

析构用户定义类型

定义一个Deconstruct函数,参数加out

public class Point
{
    public Point(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public double X { get; }
    public double Y { get; }

    public void Deconstruct(out double x, out double y)
    {
        x = this.X;
        y = this.Y;
    }
}

var p = new Point(3.14, 2.71);
(double X, double Y) = p;

 

弃元

通常,在进行元组解构或使用 out 参数调用方法时,必须定义一个其值无关紧要且你不打算使用的变量。 为处理此情况,C# 增添了对弃元的支持。 弃元是一个名为 _(下划线字符)的只写变量,可向单个变量赋予要放弃的所有值。 弃元类似于未赋值的变量;不可在代码中使用弃元(赋值语句除外)。

在以下方案中支持弃元:

 

  • 在对元组或用户定义的类型进行解构时。

  • 在使用 out 参数调用方法时。

  • 在使用 is 和 switch 语句匹配操作的模式中。

  • 在要将某赋值的值显式标识为弃元时用作独立标识符。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
       var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);

       Console.WriteLine($"Population change, 1960 to 2010: {pop2 - pop1:N0}");
   }
   
   private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2)
   {
      int population1 = 0, population2 = 0;
      double area = 0;
      
      if (name == "New York City") {
         area = 468.48; 
         if (year1 == 1960) {
            population1 = 7781984;
         }
         if (year2 == 2010) {
            population2 = 8175133;
         }
      return (name, area, year1, population1, year2, population2);
      }

      return ("", 0, 0, 0, 0, 0);
   }
}
// The example displays the following output:
//      Population change, 1960 to 2010: 393,149

 

分享到:
评论

相关推荐

    C# 元组和值元组的具体使用

    C# 7.0已经出来一段时间了,大家都知道新特性里面有个对元组的优化:ValueTuple。这里利用详尽的例子详解Tuple VS ValueTuple(元组类VS值元组),10分钟让你更了解ValueTuple的好处和用法。 如果您对Tuple足够了解...

    C# 7.0中解构功能详解

     C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[] args) { (var name, var age) = GetUser(); ...

    干货来袭! C# 7.0 新特性(VS2017可用)

    分享一下其实2016年12月就已经公布了的C#7.0的新特性吧,虽然很早就出来了,但咱这IDE不支持啊.. 不过在昨天的VS2017中已经完美可以支持使用了. E文好的,移步官方介绍地址:...

    C#7.0中新特性汇总

    以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分将活跃起来。现在是时候来展示这些特性,你也告诉借此告诉我们你的想法! C#7.0 增加了许多新...

    精通C#第八版元组章节.rar

    最近做的项目中用到了元组,这是C#7新添加的集合类型。目前C#7和.Net Core 2.0的书不多,那本清华翻译的红皮书内容简直惨不忍睹,自行翻译了《Pro C# 7, 8th Edition》的一部分内容,虽然翻译没有经过修饰很粗糙,但...

    C#语法新特性之元组实例详解

    元组(Tuple)在4.0 的时候就有了,但元组也有些缺点,具体那些缺点,本文给大家介绍的非常详细,本文重点给大家C#语法新特征之元组,感兴趣的朋友一起学习吧

    浅析C# 9.0 新特性之 Lambda 弃元参数

    弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能从中读取值。弃元用 _(下划线) 表示,下划线是一个...

    tree-sitter-c-sharp:C#语法的保姆

    对C#的全面支持: async , var和await不能用作标识符C#7.0(完整) 元组 舍弃 基本模式匹配 递归模式匹配 推荐当地人并返回 局部功能陈述 表达式身体构造函数 表情强壮的析构函数/终结器 投掷表达式 二进制和_...

    Python语言基础:元组.pptx

    元组和列表操作类似,但是元组属于不可变序列,元组创建后只可以元素覆盖不可以修改元素。元组的定义方式和列表相同,但定义时所有元素是放在一对圆括号“( )”中,用逗号“,”分隔元素值。 元组 实例:体会元组中的...

    python构造函数、元组实例.html

    了解几个简单的构造函数,如何修改元组,访问元组,遍历元组,了解元组的内置函数,len(),计算元组个数,元组的最大、最小值,tuple()将列表转化成元组

    Python 元组实例.html

    如何访问元组,修改元组,遍历元组,元组的内置函数,例如,len(),max(),min(),tuple(),

    基础篇11-python基本数据结构-元组和集合

    基础篇11-python基本数据结构-元组和集合,元组和集合的基本用法

    Python 元组-元组变量的循环遍历

    Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和...

    Python实验12元组与字典.pdf

    Python实验12元组与字典.pdf

    02-python-列表-可变和不可变类型-元组-列表与元组的速度比较

    python学习笔记,包含python列表-可变和不可变类型-元组-列表与元组的速度比较

    Python 将DataFrame数据转换成元组 Python源码

    Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成...

    python容器:列表,元组,字典,集合的思维导图

    python容器:列表,元组,字典,集合的思维导图

    Python 元组-元组和格式化字符串

    Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和...

Global site tag (gtag.js) - Google Analytics