使用Tuple的TRest组件

时间:2012-02-15 18:43:37

标签: c# list tuples

我正在尝试使用元组的TRest部分,以便我可以说将14个字符串添加到元组列表中。

List<Tuple<string, string, string, string, string, string, string, Tuple<string, string, string, string, string, string, string>>> list = new List<Tuple<string, string, string, string, string, string, string, Tuple<string, string, string, string, string, string, string>>>();   

创建第二个元组列表(list2),我将7个字符串添加到:

Tuple<string, string, string, string, string, string, string> list2 = Tuple.Create(test8, test9, test10, test11, test12, test13, test14);

然后将所有字符串添加到第一个列表中:

list.Add(Tuple.Create(test1, test2, test3, test4, test5, test6, test7, list2));

我遇到了一个重载错误,在我做一些根本不正确的事情之前我没有尝试过使用它吗?

1 个答案:

答案 0 :(得分:5)

要在元组上使用TRest,你必须包含另一个元组,例如16元组的int将是:

Tuple<int, int, int, int, int, int, int, 
    Tuple<int, int, int, int, int, int, int, 
        Tuple<int,int>>> t16;

然后,访问元素1-7:

var x1 = t16.Item1;
...
var x7 = t16.Item7;

然后,访问元素8-14:

var x8 = t16.Rest.Item1;
...
var x14 = t16.Rest.Item7;

然后,访问元素15,16:

var x15 = t16.Rest.Rest.Item1;
var x16 = t16.Rest.Rest.Item2;

等等。我有一篇博文,如果有兴趣的话,可以潜入here ......

<强>更新

您的具体错误是因为具有8个类型参数的Tuple.Create()旨在创建八元组,而不是九元组及更高版本。因此:

Tuple.Create<T1, T2, T3, T4, T5, T6, T7, T8>(...)

实际创建一个

Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>

因为你传递了

Tuple<string, string, string, string, string, string, string>

作为T8,它将Septuple包装在第8个元素中,这不是你所期望的。

这就是为什么抱怨类型不匹配的原因,如果你在错误中注意到它有Tuple<Tuple<string, string, string, string, string, string, string>>作为T8,这是一个包含在元组中的七元组。

因此,如果你想要隐式输入,或者手工构建它,你或者需要为Tuple编写一些9元组及以上的扩展:

list.Add(new Tuple<string, string, string, string, string, string, string, 
    Tuple<string, string, string, string, string, string, string>>(
        test1, test2, test3, test4, test5, test6, test7, list2));

大元组可能令人困惑的众多原因中的一个。