C#编程零基础到入门学习-C# 元组(Tuple)基于C# 7.0之前(4-12)

C#编程零基础到入门学习-C# 元组(Tuple)基于C# 7.0之前(4-12)

编码文章call10242025-04-07 15:40:1523A+A-

特别说明本节会存在歧义:

在C# 7.0之前的版本中,可以使用Tuple类来创建元组

从C# 7.0开始,引入了新的元组类型,称为“值元组”(Value Tuples)因此后面的方法和一些理论知识有点区别,本节暂时以C# 7.0之前的版本为主

C#中的元组(Tuple)是一种轻量级的数据结构,用于存储和处理一组数据。元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构,它是一种不可变的结构,意味着一旦创建,就不能更改其中的元素

元组可以包含不同类型的数据,例如整数、字符串、布尔值等。

在C#中,元组是通过System.Tuple类来实现的。该类有多个泛型重载,用于创建不同数量和类型的元组。例如,Tuple表示一个包含一个元素的元组,Tuple表示一个包含两个元素的元组,以此类推。

语法:

Tuple//最多到8

示例创建一个包含三个元素的元组:

Tuple person = new Tuple (1, "ZhangSan", "HeNan");
//三个元素(1, "ZhangSan", "HeNan")

声明元组变量、对它进行初始化并访问其数据成员:

完整示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TupleType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个包含三个元素的元组  
            
            var student2 = Tuple.Create("WangWu",26,"HeBei");//类型1
            Tuple person = new Tuple(26, "LiSi", "HeNan");//类型2

            // 访问元组中的元素  
            Console.WriteLine("Name2:"+person.Item2+"\n"+"Address:"+person.Item3+"\n"+"Age:"+person.Item1);
            Console.WriteLine("--------------------------");
            Console.WriteLine("Name3:" + student2.Item1 + "\n" + "Address:" + student2.Item3 + "\n" + "Age:" + student2.Item2);
        }
    }
}


运行结果

上面的示例创建了一个Tuple包含一个人的记录的实例。为每个元素指定一种类型,并将值传递给构造函数,其实指定每个元素的类型很麻烦(类型1)。但是好在C#引入了一个静态帮助器类Tuple,,该类返回Tuple 的实例,而不必指定每个元素的类型(类型2)。都是使用Item1Item2等属性来访问元组中的元素。

类型2的格式:

var person = Tuple.Create(1, "ZhangSan", "HeNan");

一个元组最多只能包含八个元素。当您尝试包含八个以上的元素时,它将产生编译器错误。

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);//最多了


报错说明

改为8个元素后正常

访问元组元素

元组元素可以通过 Item < elementnumber> 属性访问,例如 Item1、 Item2、 Item3等,最多可以访问 Item7属性。Item1属性返回第一个元素,Item2返回第二个元素,依此类推。最后一个元素(第8个元素)将使用 Rest 属性返回

访问元组元素示例代码:


Tuple使用和版本提示

完整示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TupleType2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var person = Tuple.Create(1,2,3);
            Console.WriteLine(person.Item1);//1
            Console.WriteLine(person.Item2);//2
            Console.WriteLine(person.Item3);//3

            var numbers = Tuple.Create("1", 2, 3, "4", 5, "6", 7, 8);
            Console.WriteLine(numbers.Item1);//1
            Console.WriteLine(numbers.Item2);//2
            Console.WriteLine(numbers.Item3);//3
            Console.WriteLine(numbers.Item4);//4
            Console.WriteLine(numbers.Item5);//5
            Console.WriteLine(numbers.Item6);//6
            Console.WriteLine(numbers.Item7);//7
            Console.WriteLine(numbers.Rest);//8
            Console.WriteLine(numbers.Rest.Item1);//8
            Console.WriteLine(numbers.Rest.GetType());//INT

        }
    }
}
//最后一个元素(第8个元素)将使用 Rest 属性返回

一般情况下,第8个位置用于嵌套元组,您可以使用Rest属性访问该位置。

嵌套元组

如果要在一个元组中包含八个以上的元素,则可以通过嵌套另一个元组对象作为第八个元素来实现。可以使用Rest属性访问最后一个嵌套元组。要访问嵌套元组的元素,就要使用到Rest.Item1.Item属性。

嵌套元组完整示例代码1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TupleType3
{
    internal class Program
    {
        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.Item2); // 2
            Console.WriteLine(numbers.Item3); // 3
            Console.WriteLine(numbers.Item4); // 4
            Console.WriteLine(numbers.Item5); // 5
            Console.WriteLine(numbers.Item6); // 6
            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
            Console.WriteLine(numbers.Rest.Item1.Item3);//10
            Console.WriteLine(numbers.Rest.Item1.Item4);//10
            Console.WriteLine(numbers.Rest.Item1.Item5);//10
            Console.WriteLine(numbers.Rest.Item1.Item6);//10
        }
    }
}

运行结果

也可以在序列中的任何位置包括嵌套元组对象。但是,建议将嵌套的元组放在序列的末尾,以便可以使用Rest属性访问它。

嵌套元组完整示例代码1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TupleType4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7, 8), 9, 10, 11, 12, 13);
            Console.WriteLine(numbers.Item1);//1
            Console.WriteLine(numbers.Item2);//2
            Console.WriteLine(numbers.Item3);//(3, 4, 5, 6, 7, 8)
            Console.WriteLine(numbers.Item4); //9
            Console.WriteLine(numbers.Item5);//10               
            Console.WriteLine(numbers.Item6);//11
            Console.WriteLine(numbers.Item7);//12
            Console.WriteLine(numbers.Rest.Item1);//13
            Console.WriteLine(numbers.Item3.Item1);//3
            Console.WriteLine(numbers.Item3.Item2);//4
            Console.WriteLine(numbers.Item3.Item3);//5
            Console.WriteLine(numbers.Item3.Item4);//6
            Console.WriteLine(numbers.Item3.Item5);//7
            Console.WriteLine(numbers.Item3.Item6);//8

        }
    }
}
//可以尝试修改上述代码,嵌套不同位置及在不同位置访问元组的数据

运行结果

可以尝试修改上述代码,嵌套不同位置及在不同位置访问元组的数据,多加练习。

元组作为方法参数

方法可以将元组作为参数使用。

完整示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TupleType5
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var person = Tuple.Create(1, "ZhangSan", "HeNan");
            DisplayTuple(person);
        }
        static void DisplayTuple(Tuple person)
        {
            Console.WriteLine($"Id = {person.Item1}");
            Console.WriteLine($"First Name = {person.Item2}");
            Console.WriteLine($"Last Name = {person.Item3}");
        }
    }
}


运行结果

元组作为返回类型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TupleType6
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var person = GetPerson();
            Console.WriteLine(person);
            Console.WriteLine("ID: "+person.Item1);
            Console.WriteLine("Name: "+person.Item2);
            Console.WriteLine("Address: "+person.Item3);
        }
        static Tuple GetPerson()
        {
            return Tuple.Create(1, "ZhangSan", "HeNan");
        }
    }
}

运行结果

元组的用法

元组可以在以下情况下使用:

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

元组缺点(有歧义,但是本节还是按照c#7之前的版本,后面再写c#7之后的,水平有限,自己也怕混淆了,混淆的了更麻烦):

  1. Tuple是一个引用类型,而不是一个值类型。它在堆上分配,并可能导致CPU密集型操作。
  2. Tuple被限制为包括八个元素。如果需要存储更多元素,则需要使用嵌套元组。但是,这可能导致歧义。
  3. 可以使用名称模式 Item 的属性访问Tuple元素,这是不太合理的。

C#7引入了ValueTuple以克服Tuple的局限性。

关于歧义:在C# 7.0之前的版本中,可以使用Tuple类来创建元组。Tuple类位于System命名空间中,具有多个泛型重载,用于创建不同数量和类型的元组。例如,Tuple表示一个包含一个元素的元组,Tuple表示一个包含两个元素的元组,以此类推。

从C# 7.0开始,引入了新的元组类型,称为“值元组”(Value Tuples)。值元组是更为轻量级和高效的数据结构,可以用于更多的场景。值元组使用括号和逗号来定义元素,而不是使用Tuple类。例如,(int, string)表示一个包含一个整数和一个字符串的值元组。值元组还支持解构赋值,可以方便地将值元组的值赋给单独的变量。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4