元组
# 元组
元组是C#7.0终引入的新语法,元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构。
(double, int) t1 = (2.24,15);
Console.WriteLine(t1);
(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
1
2
3
4
5
2
3
4
5
若要定义元组类型,需要指定其所有数据成员的类型,或者,可以指定字段名称。 虽然不能在元组类型中定义方法,但可以使用 .NET 提供的方法,如下面的示例所示:
(double, int) t = (4.5, 3);
Console.WriteLine(t.ToString());
Console.WriteLine($"Hash code of {t} is {t.GetHashCode()}.");
internal class Test1
{
public (double a, int b) GetData()
{
return (12.1,1);
}
}
Test1 test1 = new Test1();
var result = test1.GetData();
Console.WriteLine($"a:{result.a},b:{result.b}");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 特性
元组类型支持相等运算符== 和 !=。
元组类型是值类型;元组元素是公共字段。 这使得元组为可变的值类型。
元组功能需要 System.ValueTuple 类型和相关的泛型类型(例如 System.ValueTuple<T1,T2>),这些类型在 .NET Core 和 .NET Framework 4.7 及更高版本中可用。 若要在面向 .NET Framework 4.6.2 或更早版本的项目中使用元组,请将 NuGet 包 System.ValueTuple 添加到项目。
可以使用任意数量的元素定义元组。
var t3 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26); Console.WriteLine(t3.Item26);
1
2
3
4
5可以在元组初始化表达式中或元组类型的定义中显式指定元组字段的名称。
var t4 = (Sum: 4.5, Count: 3); Console.WriteLine($"Sum of {t4.Count} elements is {t4.Sum}.");
1
2如果未指定字段名称,则可以根据元组初始化表达式中相应变量的名称推断出此名称
var sum = 4.5; var count = 3; var t5= (sum, count); Console.WriteLine($"Sum of {t5.count} elements is {t5.sum}.");
1
2
3
4在这些情况下,你可以显式指定字段的名称,或按字段的默认名称访问字段。元组字段的默认名称为
Item1
、Item2
、Item3
等。 始终可以使用字段的默认名称,即使字段名称是显式指定的或推断出的。var a = 1; var t6 = (a, b: 2, 3); Console.WriteLine($"The 1st element is {t6.Item1} (same as {t6.a})."); Console.WriteLine($"The 2nd element is {t6.Item2} (same as {t6.b})."); Console.WriteLine($"The 3rd element is {t6.Item3}.");
1
2
3
4
5元组赋值和元组相等比较不会考虑字段名称。在编译时,编译器会将非默认字段名称替换为相应的默认名称。 因此,显式指定或推断的字段名称在运行时不可用。
# 元组赋值和析构
C# 支持满足以下两个条件的元组类型之间的赋值:
- 两个元组类型有相同数量的元素
- 对于每个元组位置,右侧元组元素的类型与左侧相应的元组元素的类型相同或可以隐式转换为左侧相应的元组元素的类型
(int, double) t1 = (17, 3.14);
(double First, double Second) t2 = (0.0, 1.0);
t2 = t1;
Console.WriteLine($"{nameof(t2)}: {t2.First} and {t2.Second}");
1
2
3
4
2
3
4
// 使用现有字段创建元组
var destination = string.Empty;
var distance = 0.0;
var t = ("post office", 3.6);
(destination, distance) = t;
Console.WriteLine($"Distance to {destination} is {distance} kilometers.");
1
2
3
4
5
6
7
2
3
4
5
6
7
上次更新: 2023/05/09, 17:54:37