C# - 元组 (Tuple)
Tuple<T>
类是在 .NET Framework 4.0 中引入的。元组是一种数据结构,包含不同数据类型元素的序列。它可以在您想要一个数据结构来保存具有属性的对象,但又不想为其创建单独类型的情况下使用。
Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>
以下示例创建了一个包含三个元素的元组
Tuple<int, string, string> person =new Tuple <int, string, string>(1, "Steve", "Jobs");
在上面的示例中,我们创建了一个保存人员记录的 `Tuple` 实例。我们为每个元素指定了类型并向构造函数传递了值。为每个元素指定类型很麻烦。C# 包含一个静态辅助类 `Tuple`,它返回 `Tuple<T>` 的实例,而无需指定每个元素的类型,如下所示。
var person = Tuple.Create(1, "Steve", "Jobs");
元组最多只能包含八个元素。当您尝试包含超过八个元素时,它会给出编译错误。
var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
访问元组元素
元组元素可以使用 `Item<elementNumber>` 属性访问,例如 Item1、Item2、Item3,依此类推直到 Item7 属性。Item1 属性返回第一个元素,Item2 返回第二个元素,依此类推。最后一个元素(第 8 个元素)将使用 `Rest` 属性返回。
示例:访问元组元素
var person = Tuple.Create(1, "Steve", "Jobs");
person.Item1; // returns 1
person.Item2; // returns "Steve"
person.Item3; // returns "Jobs"
var numbers = Tuple.Create("One", 2, 3, "Four", 5, "Six", 7, 8);
numbers.Item1; // returns "One"
numbers.Item2; // returns 2
numbers.Item3; // returns 3
numbers.Item4; // returns "Four"
numbers.Item5; // returns 5
numbers.Item6; // returns "Six"
numbers.Item7; // returns 7
numbers.Rest; // returns (8)
numbers.Rest.Item1; // returns 8
通常,第 8 个位置用于嵌套元组,您可以使用 `Rest` 属性访问它。
嵌套元组
如果您想在一个元组中包含超过八个元素,您可以通过将另一个元组对象作为第八个元素进行嵌套来实现。最后一个嵌套元组可以使用 `Rest` 属性访问。要访问嵌套元组的元素,请使用 `Rest.Item1.Item<elelementNumber>` 属性。
示例:嵌套元组
var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13));
numbers.Item1; // returns 1
numbers.Item7; // returns 7
numbers.Rest.Item1; //returns (8, 9, 10, 11, 12, 13)
numbers.Rest.Item1.Item1; //returns 8
numbers.Rest.Item1.Item2; //returns 9
您可以将嵌套元组对象包含在序列中的任何位置。但是,建议将嵌套元组放在序列的末尾,以便可以使用 `Rest` 属性访问它。
示例:嵌套元组
var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7, 8), 9, 10, 11, 12, 13 );
numbers.Item1; // returns 1
numbers.Item2; // returns 2
numbers.Item3; // returns (3, 4, 5, 6, 7, 8)
numbers.Item3.Item1; // returns 3
numbers.Item4; // returns 9
numbers.Rest.Item1; //returns 13
元组作为方法参数
方法可以有一个元组作为参数。
static void Main(string[] args)
{
var person = Tuple.Create(1, "Steve", "Jobs");
DisplayTuple(person);
}
static void DisplayTuple(Tuple<int,string,string> person)
{
Console.WriteLine($"Id = { person.Item1}");
Console.WriteLine($<span className="str">"First Name = { person.Item2}"</span>);
Console.WriteLine($<span className="str">"Last Name = { person.Item3}"</span>);
}
元组作为返回类型
元组可以从方法中返回。
static void Main(string[] args)
{
var person = GetPerson();
}
static Tuple<int, string, string> GetPerson()
{
return Tuple.Create(1, "Bill", "Gates");
}
元组的用法
元组可用于以下场景
- 当您想从方法返回多个值而无需使用 `ref` 或 `out` 参数时。
- 当您想通过单个参数向方法传递多个值时。
- 当您想暂时保存数据库记录或某些值而无需创建单独的类时。
元组的限制
- `Tuple` 是引用类型而不是值类型。它在堆上分配,可能导致 CPU 密集型操作。
- `Tuple` 限制为包含八个元素。如果您需要存储更多元素,则需要使用嵌套元组。然而,这可能会导致歧义。
- `Tuple` 元素可以使用具有名称模式 `Item<elementNumber>` 的属性进行访问,这没有意义。
C# 7 包含 ValueTuple 以克服 Tuple 的限制,并使其更易于使用 Tuple。在下一章中了解它。