如何使用Tuple.Create()方法创建这样的元组

时间:2017-08-20 08:50:24

标签: c# tuples

如果我写这样的代码:

var a = Tuple.Create(1,2,3);
var b = Tuple.Create(1,2,3,4,5,6,7,a);

它实际上创建了一个类型为:

的元组
Tuple<int,int,int,int,int,int,int,Tuple<Tuple<int,int,int>>>

我如何使用Tuple.Create()方法创建一个像:

这样的元组
Tuple<int,int,int,int,int,int,int,Tuple<int,int,int>>

2 个答案:

答案 0 :(得分:4)

正如documentation所说,Tuple.Create<T1, T2, T3, T4, T5, T6, T7, T8>方法的返回值是System.Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>,其中第8个参数被包装到新元组中。如果你将元组作为最后一个参数传递,那么这个元组将被包含在元组中,你现在就得到Tuple<Tuple<>>

这种创作方法的

Implementation非常简单:

static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(
   T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
{
    return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(
        item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
}

正如您所看到的那样,最后一个参数被简单地包装并传递给构造函数。你在这里无能为力。

但你至少有两种选择。您可以直接使用元组构造函数。当然,在这种情况下,您必须手动指定元组类型。或者,您可以创建自己的创建方法,而无需最后一个参数包装,这将为您进行类型推断:

static Tuple<T1, T2, T3, T4, T5, T6, T7, T8> CreateTuple<T1, T2, T3, T4, T5, T6, T7, T8>(
    T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
    where T8: ITuple
{
    return new Tuple<T1, T2, T3, T4, T5, T6, T7, T8>(
        item1, item2, item3, item4, item5, item6, item7, item8);
}

用法

var a = Tuple.Create(1,2,3);
var b = CreateTuple(1,2,3,4,5,6,7,a);
// Tuple<int,int,int,int,int,int,int,Tuple<int,int,int>>

请注意,使用C#7,我们有Value Tuples,它提供了更好的接口和良好命名的属性。 E.g。

var point = (x: 1, y: 2, z: 3);
var rocket = (id: 1, speed: 100, location: point);

// rocket.location.y

答案 1 :(得分:3)

你做不到。根据MSDN: Tuple Class (System)

  

.NET Framework直接支持具有一到七个元素的元组。此外,您可以通过将元组对象嵌套在Tuple对象的Rest属性中来创建八个或更多元素的元组。

因此,TupleTuple为第8个元素。