zoukankan      html  css  js  c++  java
  • .Net/C# -- ValueTuple学习1

    ValueTuple学习

    ValueTuple是C# 7.0的新特性之一,.Net Framework 4.7以上版本可用。

    值元组也是一种数据结构,用于表示特定数量和元素序列,但是是和元组类不一样的,主要区别如下:

    • 值元组是结构,是值类型,不是类,而元组(Tuple)是类,引用类型;
    • 值元组元素是可变的,不是只读的,也就是说可以改变值元组中的元素值;
    • 值元组的数据成员是字段不是属性。

    值元组的具体使用如下:

    1.    如何创建值元组

    .Net Framework值元组只支持1到7个元组元素,如果有8个元素或者更多,需要使用值元组的嵌套和Rest属性去实现。另外ValueTuple类可以提供创造值元组对象的静态方法。

    1:利用构造函数创建元组:

    var valueTuple1 = new ValueTuple<string, string, string>("张三", "李四", "王二");
    
                string name1 = valueTuple1.Item1;
    
                string name2 = valueTuple1.Item2;
    
                string name3 = valueTuple1.Item3;
    
                Console.WriteLine($"我是{name1},我是{name2},我是{name3}");
    
                ////////////////////////////////////////////////////////////
    
     var valueTuple3 = new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int, int, int>>(1, 2, 3, 4, 5, 6, 7, new ValueTuple<int, int, int>(8, 9, 10));
    
                int item1 = valueTuple3.Item1;
    
                int item10 = valueTuple3.Rest.Item3;
    
                Console.WriteLine($"item1:{item1},item10:{item10}");

    2:利用Tuple静态方法构建元组,最多支持八个元素:

    var valueTuple2 = ValueTuple.Create<int, int, int>(1, 2, 3);
    
                int val1 = valueTuple2.Item1;
    
                int val2 = valueTuple2.Item2;
    
                int val3 = valueTuple2.Item3;
    
                Console.WriteLine($"{val1},{val2},{val3}");
    
    var valueTuple4 = ValueTuple.Create<int, int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7, 8);
    
                int v1 = valueTuple4.Item1;
    
                int v8One = valueTuple4.Item8;
    
                int v8Two = valueTuple4.Rest.Item1;
    
                Console.WriteLine($"item1:{v1},item8:{v8One},item8:{v8Two}");

    注意:这里构建出来的Tuple类型其实是Tuple<int, int, int, int, int, int, int, Tuple<int>>,因此testTuple8.Rest取到的数据类型是Tuple<int>,因此要想获取准确值需要取Item1属性。对于上面的例子,要访问第八个元素,既可以通过testTuple4.Rest.Item1访问,也可以通过testTuple4.Item8获取

    2.    表示一组数据

    如下创建一个值元组表示一个学生的三个信息:名字、年龄和身高,而不用单独额外创建一个类。

    var valTupleInfo = new ValueTuple<string, int, string>("张三", 16, "地球");
    
      string valName = valTupleInfo.Item1;
    
      int valAge = valTupleInfo.Item2;
    
      string valAdd = valTupleInfo.Item3;
    
      Console.WriteLine($"你好,我叫{valName},我今年{valAge}岁,来自{valAdd}");

    3.    从方法返回多个值

    值元组也可以在函数定义中代替out参数返回多个值

    static ValueTuple<string, int, uint> GetStudentInfo(string name)
    {
        return new ValueTuple <string, int, uint>("Bob", 28, 175);
    }
    static void RunTest()
    {
        var studentInfo = GetStudentInfo("Bob");
        Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
    }

    返回值可以不明显指定ValueTuple:

    static (string, int, uint) GetStudentInfo1(string name)
    {
        return ("Bob", 28, 175);
    }
    static void RunTest1()
    {
        var studentInfo = GetStudentInfo1("Bob");
        Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
    }

    4.    用于单参数方法的多值传递

    当函数参数仅是一个Object类型时,可以使用值元组实现传递多个值。

    static void WriteStudentInfo(Object student)
            {
                var studentInfo = (ValueTuple<string, int, uint>)student;
                Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
            }
            static void RunTest()
            {
                var t = new ValueTuple<string, int, uint>("Bob", 28, 175);
    
                WriteStudentInfo(t);
    
            }

    5.    解构ValueTuple

    可以通过var (x, y)或者(var x, var y)来解析值元组元素构造局部变量,同时可以使用符号”_”来忽略不需要的元素。

    static (string name, int age, uint height) GetStudentInfo1(string name)
    {
        return ("Bob", 28, 175);
    }
    
    static void RunTest1()
    {
        var (name, age, height) = GetStudentInfo1("Bob");
        Console.WriteLine($"Student Information: Name [{name}], Age [{age}], Height [{height}]");
    
        (var name1, var age1, var height1) = GetStudentInfo1("Bob");
        Console.WriteLine($"Student Information: Name [{name1}], Age [{age1}], Height [{height1}]");
    
        var (_, age2, _) = GetStudentInfo1("Bob");
        Console.WriteLine($"Student Information: Age [{age2}]");
    }

    自己在读C#7.0本质论这一本书,见到了元组这个东西,感觉灵活实用,特地学习一下,总结一下。如有错误请留言,如觉得不错请推荐,谢谢支持!!!

  • 相关阅读:
    LeetCode具体分析 :: Recover Binary Search Tree [Tree]
    [leetcode] Path Sum
    System、应用程序进程的Binder线程池和Handler消息循环
    R(二): http与R脚本通讯环境安装
    R(一): R基础知识
    Hive(五):hive与hbase整合
    Hive(六):HQL DDL
    Hive(四):c#通过odbc访问hive
    Hive(三):SQuirrel连接hive配置
    Hive(二):windows hive ODBC 安装
  • 原文地址:https://www.cnblogs.com/dcy521/p/13466790.html
Copyright © 2011-2022 走看看