C# - 元组(Tuple)

本文关键字:Tuple 元组 | 更新日期: 2023-09-12 17:39:41

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($"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");
}

元组的使用

元组可用于以下方案:

  1. 当您想要从方法返回多个值而不使用refout参数时。
  2. 当您希望通过单个参数将多个值传递给方法时。
  3. 当您想要临时保存数据库记录或某些值而不创建单独的类时。

元组限制:

  1. Tuple是引用类型,而不是值类型。它在堆上分配,可能会导致 CPU 密集型操作。
  2. Tuple仅限于包括八个元素。如果需要存储更多元素,则需要使用嵌套元组。但是,这可能会导致歧义。
  3. Tuple元素可以使用具有名称模式的属性来访问 Item<elementNumber> ,这是没有意义的。

C# 7 包含 ValueTuple,以克服元组的限制,使使用元组变得更加容易。在下一章中了解它。