Tuple类的元组

posted at 2020.9.4 07:48 by 风信子

元组就是将一组松散的对象简单地组合在一起。元组比数组的灵活性略强,因为数组中所有元素的类型是统一的,而元组使用了泛型参数,使得每个元素的类型相互独立。元组不同于类和结构,类和结构是高度整合的数据类型,其中要实现各种复杂的功能。

.NET框架最早引入元组的概念,是通过Tuple类实现的,而且存在多个泛型版本,可容纳元素数量为1~8个。元组中将所有元素分配给Item*属性,其中*表示序号,例如Item1Item2Item3等。

创建元组实例有三种方法:

    (1) 直接调用泛型版本Tuple类构造函数。如:

  Tuple < int, long, char > t = new Tuple < int, long, char > ( 1000,20000L, ’p’ );

    (2) 直接调用Tuple类的Create方法,此方法为静态方法,格式如下:

    var k = Tuple.Create < byte, string > ( 255, ”full” );

    (3) Vaule Tuple的使用方法与Tuple类似。但VauleTuple是值类型,不需要分配堆内存,效率更优于Tuple类。ValueTuple支持初始化后仍然可以修改元素。它也得到C#语法的支持,可以用简洁的语法声明。如:

 ① var a = ( 100, ( byte ) 15, true );

 ② ValueTuple < string, string > b = ( “Jack”, ”Bob” );

 ③ ( long, uint) f = ( 123454321L, 7899 );

声明元组时,如果不使用变量名,则编译器会将元组中的各个字段自动解构为单独的变量,当然也可以用var关键字来声明。

C#语言的元组还支持将用户自定义的类型进行解构,即可以将某个类的属性解构为元组。做法是:在类型中定义一个公共方法,返回类型为void,方法命名为Deconstruct

元组的另一个作用充当方法的返回值。尤其是在一个方法中需要同时返回多个对象给调用方的时候,虽然可以使用out参数,但使用元组可以更简洁。

下面举一实例:

    (1)新建一个控制台应用程序项目。

    (2)定义一个返回三元组的方法。

       static (string, int, string) GetData()

       {

            return ("Test 1", 35, "Test 2");

       }

    (3) 调用上述方法,获取返回的元组后,不对字段重命名,直接输出。

               var k = GetData();

               Console.WriteLine("未对字段重命名:");

         Console.WriteLine("Item1 = {0}, Item2 = {1}, Item3 = {2}", k.Item1, k.Item2, k.Item3);

    (4)也可以在获取返回的元组后,对字段重命名。

           var (Mark1, Count, Mark2) = GetData();

           Console.WriteLine("\n对字段进行重命名:");

           Console.WriteLine($"{nameof(Mark1)}={Mark1},{nameof(Count)}={Count},        {nameof(Mark2)} = {Mark2}");

    (5)Program类中定义一个方法,在返回二元组时,重命名字段。

     static (int Number1, int Number2) GetNumbers()

  {

            Random rand = new Random();

            return (rand.Next(0, 1000), rand.Next(0, 1000));

     }

     (6)调用方法,获取返回的元组,并直接访问已经命名的字段。

     var d = GetNumbers();

Console.WriteLine("\n返回带重命名字段的元组:");

     Console.WriteLine($"{nameof(d.Number1)}={d.Number1}, {nameof(d.Number2)} = {d.Number2}");

    (7) 运行应用程序,控制台输出结果如图所示:

 

Tags: , , , , ,

IT技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading