C#高级编程(第10版) C# 6 & .NET Core 1.0 (.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

7.8 元组

数组合并了相同类型的对象,而元组合并了不同类型的对象。元组起源于函数编程语言(如F#),在这些语言中频繁使用元组。在.NET Framework中,元组可用于所有的.NET语言。

.NET Framework定义了8个泛型Tuple类和一个静态Tuple类,它们用作元组的工厂。不同的泛型Tuple类支持不同数量的元素。例如,Tuple<T1>包含一个元素,Tuple<T1, T2>包含两个元素,依此类推。

方法Divide()返回包含两个成员的元组Tuple<int, int>。泛型类的参数定义了成员的类型,它们都是整数。元组用静态Tuple类的静态Create()方法创建。Create()方法的泛型参数定义了要实例化的元组类型。新建的元组用result和remainder变量初始化,返回这两个变量相除的结果(代码文件TupleSample/Program.cs):

        public static Tuple<int, int> Divide(int dividend, int divisor)
        {
          int result = dividend / divisor;
          int remainder = dividend % divisor;
          return Tuple.Create(result, remainder);
        }

下面的代码说明了Divide()方法的调用。可以用属性Item1和Item2访问元组的项:

        var result = Divide(5, 2);
        WriteLine($"result of division: {result.Item1}, remainder: {result.Item2}");

如果元组包含的项超过8个,就可以使用带8个参数的Tuple类定义。最后一个模板参数是TRest,表示必须给它传递一个元组。这样,就可以创建带任意个参数的元组了。

下面说明这个功能:

        public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>

其中,最后一个模板参数是一个元组类型,所以可以创建带任意多项的元组:

        var tuple = Tuple.Create<string, string, string, int, int, int, double,
            Tuple<int, int>>("Stephanie", "Alina", "Nagel", 2009, 6, 2, 1.37,
                Tuple.Create<int, int>(52, 3490));