C#元组的使用

元组(Tuple)是在C# 4.0时出的新特性,需要.Net Framework 4.0以上版本支持。

元组是一种数据结构,具有特定数量和元素序列。

创建一个元组

1
2
var testTuple = new Tuple<string, string, string>("这", "是一个", "元组");
Console.WriteLine(test.Item1 + test.Item2 + test.Item3);

使用场景

从方法返回多个值

1
2
3
4
5
6
7
8
9
/// <summary>
/// 获取坐标
/// </summary>
/// <returns></returns>
static Tuple<double, double> GetCoordin(){
return new Tuple<double, double>(113.372901,34.779973);
}
var coordin=GetCoordin();
Console.WriteLine($"经度:{coordin.Item1},纬度:{coordin.Item2}")

每一次都声明一个元组太麻烦了?

来试试值元组(ValueTuple),ValueTuple是C# 7.0的新特性,使用时需要.Net Framework 4.7以上版本支持或者4.0以上安装System.ValueType包

值元组也是一种数据结构,用于表示特定数量和元素序列,但是是和元组类不一样的,主要区别如下:

  • 值元组是结构,是值类型,不是类,而元组(Tuple)是类,引用类型;
  • 值元组元素是可变的,不是只读的,也就是说可以改变值元组中的元素值;
  • 值元组的数据成员是字段不是属性。

要注意的是:ValueTuple是结构类型,微软建议超过64字节不要使用结构,对ValueTuple 同样有效。

创建一个值元组

值元组可以像元组一样利用构造函数创建

1
2
3
4
5
6
7
8
9
10
/// <summary>
/// 获取坐标
/// </summary>
/// <returns></returns>
static ValueTuple<double, double> GetCoordinByValueTuple()
{
return new ValueTuple<double, double>(113.372901, 34.779973);
}
var coordin=GetCoordin();
Console.WriteLine($"经度:{coordin.Item1},纬度:{coordin.Item2}")

也可以用Tuple静态方法构建元组,最多支持八个元素

1
2
3
4
5
6
7
8
9
10
/// <summary>
/// 获取坐标
/// </summary>
/// <returns></returns>
static ValueTuple<double, double> GetCoordinByStatic()
{
return ValueTuple.Create(113.372901, 34.779973);
}
var coordin=GetCoordin();
Console.WriteLine($"经度:{coordin.Item1},纬度:{coordin.Item2}")

还是麻烦?真是拿你们没办法哟,把ValueTuple扔掉,直接用小括号

1
2
3
4
5
6
static (double,double) GetCoordinByParenthesis()
{
return (113.372901, 34.779973);
}
var coordin=GetCoordin();
Console.WriteLine($"经度:{coordin.Item1},纬度:{coordin.Item2}")

返回值可以指定元素名字,方便理解记忆赋值和访问,:exclamation: 所有的元素名字都只是设计和编译时用的,不是运行时用的(因此注意对该类型的序列化和反序列化操作);

1
2
3
4
5
6
static (double Lon, double Lat) GetCoordinByName()
{
return (113.372901, 34.779973);
}
var coordin=GetCoordin();
Console.WriteLine($"经度:{coordin.Lon},纬度:{coordin.Lon}")

在使用时也可以构造局部变量,同时可以用_来忽略不需要的元素

1
2
3
4
5
6
static (double Lon, double Lat) GetCoordinByName()
{
return (113.372901, 34.779973);
}
var (_,lon)=GetCoordin();
Console.WriteLine($"纬度:{lon}")

告辞:smirk: