Tuple
(ValueTuple)的使用会比这个更加方便,在下一节会介绍到它。
Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>
以下示例创建一个包含三个元素的元组:
var person = new Tuple<int, string, string>(1, "malema", ".net");
在上面的例子中,我们创建了一个保存个人记录的元组实例。 我们为每个元素指定了一个类型并将值传递给构造函数。 指定每个元素的类型参数是比较麻烦的。 Tuple里面有一个静态泛型方法Create(), 使用它的话,编译器会自动进行类型推断,如下。
var person = Tuple.Create(1, "malema", ".net");
一个元组最多只能包含八个元素。 当您尝试包含八个以上的元素时,它会给出编译器错误。
var person = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8, 9);
//有错 “Create”方法没有采用 9 个参数的重载
可以使用Item<数字> 属性访问元组元素,例如,Item1、Item2、Item3 等等,直到 Item7 属性。 Item1 属性返回第一个元素,Item2 返回第二个元素,依此类推。 最后一个元素(第 8 个元素)将使用 Rest 属性返回。
static void Main(string[] args)
{
var numbers = Tuple.Create("一", 2, 3, "四", 5, "六", 7, 8);
Console.WriteLine(numbers.Item1); // 输出 "一"
Console.WriteLine(numbers.Item2); // 输出 2
Console.WriteLine(numbers.Item3); // 输出 3
Console.WriteLine(numbers.Item4); // 输出 "四"
Console.WriteLine(numbers.Item5); // 输出 5
Console.WriteLine(numbers.Item6); // 输出 "六"
Console.WriteLine(numbers.Item7); // 输出 7
Console.WriteLine(numbers.Rest); // 输出 (8)
Console.WriteLine(numbers.Rest.Item1); // 输出 8 //注意还要加一个Item1
}
通常,第 8 个位置用于嵌套元组,您可以使用 Rest 属性访问它。
如果要在一个元组中包含八个以上的元素,可以通过嵌套另一个元组对象作为第八个元素来实现。 可以使用 Rest 属性访问最后一个嵌套的元组。 要访问嵌套元组的元素,请使用 Rest.Item1.Item<数字> 属性。
static void Main(string[] args)
{
var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13));
Console.WriteLine(numbers.Item1); // 输出 1
Console.WriteLine(numbers.Item7); // 输出 7
Console.WriteLine(numbers.Rest.Item1); //输出 (8, 9, 10, 11, 12, 13)
Console.WriteLine(numbers.Rest.Item1.Item1); //输出 8
Console.WriteLine(numbers.Rest.Item1.Item2); //输出 9
}
虽然推荐是在最后一个放入嵌套元素,但是实际上我们可以在任意位置放入嵌套元组。如下
var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7, 8), 9, 10, 11, 12, 13 );
(当需要这么多元素的时候,我们最好还是定义一个类,这样的代码可读性才更好)
static void Main(string[] args)
{
var person = Tuple.Create(1, "Malema", ".net");
DisplayTuple(person);
}
static void DisplayTuple(Tuple<int, string, string> person)
{
Console.WriteLine($"Id = { person.Item1}");
Console.WriteLine($"First Name = { person.Item2}");
Console.WriteLine($"Last Name = { person.Item3}");
}
static void Main(string[] args)
{
var person = GetPerson();
}
static Tuple<int, string, string> GetPerson()
{
return Tuple.Create(1, "Bill", "Gates");
}
C# 7 引入 ValueTuple 以克服 Tuple 的限制,并使使用 Tuple 变得更加容易。 在下一章中了解它。