首页 > 解决方案 > 用括号对数据进行分组如何工作?

问题描述

我最近遇到了这个:

(int, string) tst = (0, "Test");

它背后的想法似乎很神奇,以前每当我想映射两个变量时,我都会使用 KeyValuePair。似乎这在 .NET Core 中可用,而不是在我主要编程的常规 .NET 4.7.2 上。

我是否遗漏了什么,或者这仅在 .NET Core 上可用?这个变量分组的名称是什么(所以我可以进一步研究)?是否与创建具有两个变量的对象相同?

这是一个例子:

(int, string) tst = (0, "Test");
var (k, b) = tst;

Console.WriteLine("k: " + k);
Console.WriteLine("b: " + b);

这是一个愚蠢的问题,但感谢您的帮助。

标签: c#valuetuple

解决方案


您正在查看OP代码中的元组。元组在 C# 7.0 之前也可用,但是 C# 7.0 中元组的改进(引入了ValueTuples)意味着,可以对元组的字段使用语义名称,如示例中所示。

(int, string) tst = (0, "Test");

在上面的代码中,元组被解包并分配给tst变量。这被称为decontructing元组。

考虑以下来自 OP 的代码

(int, string) tst = (0, "Test");
var (k, b) = tst;

您可以将其结合为

var (k, b) =  (0, "Test");

您也可以在用户定义类型中使用解构。例如,考虑以下代码

public class User
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}
}

为了支持上述类中的解构,您可以添加如下方法。

public class User
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}

    public void Deconstruct(out string fName,out string lName,out int age)
    {
        fName = FirstName;
        lName = LastName;
        age = Age;
    }
}

Deconstruct 方法现在使我们能够在 Class User 中支持 Deconstruction。您现在可以编写类似于 Tuple Deconstruct 的代码。例如,

var user = new User{FirstName = "John", LastName="Doe",Age=50};
var (fName,lName,age) = user;

推荐阅读