如果我写这样的代码:
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>>
答案 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属性中来创建八个或更多元素的元组。
因此,Tuple
以Tuple
为第8个元素。