C# Tuple

Tuple 类是在 .NET Framework 4.0 中引入的。 元组是一种数据结构,其中包含一系列不同数据类型的元素。 如果我想用一个临时的结构来传递数据,又不想创建一个新类的话,就可以用它了。

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

元组的使用场景:

  • 当您想从一个方法返回多个值而不使用 ref 或 out 参数时。
  • 当您想通过单个参数将多个值传递给方法时。
  • 当您想临时保存数据库记录或某些值而不创建单独的类时。

元组的限制

  • 元组是引用类型而不是值类型。 它在堆上分配并可能导致 CPU 密集型操作。
  • 元组仅限于包含八个元素。 如果需要存储更多元素,则需要使用嵌套元组。 但是,这可能会导致歧义。
  • 可以使用名称模式为 Item 的属性访问元组元素,可读性不好。

C# 7 引入 ValueTuple 以克服 Tuple 的限制,并使使用 Tuple 变得更加容易。 在下一章中了解它。

上一篇:C# 队列 Queue
最近更新的
...