使用Tuple的TRest组件

Sta*_*age 3 c# tuples list

我正在尝试使用元组的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>>>();   
Run Code Online (Sandbox Code Playgroud)

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

Tuple<string, string, string, string, string, string, string> list2 = Tuple.Create(test8, test9, test10, test11, test12, test13, test14);
Run Code Online (Sandbox Code Playgroud)

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

list.Add(Tuple.Create(test1, test2, test3, test4, test5, test6, test7, list2));
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*are 5

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

Tuple<int, int, int, int, int, int, int, 
    Tuple<int, int, int, int, int, int, int, 
        Tuple<int,int>>> t16;
Run Code Online (Sandbox Code Playgroud)

然后,访问元素1-7:

var x1 = t16.Item1;
...
var x7 = t16.Item7;
Run Code Online (Sandbox Code Playgroud)

然后,访问元素8-14:

var x8 = t16.Rest.Item1;
...
var x14 = t16.Rest.Item7;
Run Code Online (Sandbox Code Playgroud)

然后,访问元素15,16:

var x15 = t16.Rest.Rest.Item1;
var x16 = t16.Rest.Rest.Item2;
Run Code Online (Sandbox Code Playgroud)

等等.如果感兴趣的话,我有一篇博文在这里潜入他们...

更新:

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

Tuple.Create<T1, T2, T3, T4, T5, T6, T7, T8>(...)
Run Code Online (Sandbox Code Playgroud)

实际创造一个

Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>
Run Code Online (Sandbox Code Playgroud)

既然你传递了一个

Tuple<string, string, string, string, string, string, string>
Run Code Online (Sandbox Code Playgroud)

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

这就是为什么它被抱怨的类型不匹配,如果你在它的错误通知Tuple<Tuple<string, string, string, string, string, string, string>>为T8,这是包裹在一个元组septuple.

因此,如果您想要隐式输入,或者手工构建它,您需要为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));
Run Code Online (Sandbox Code Playgroud)

这只是大元组可能混淆的众多原因之一.

  • @Paul:没问题.`Tuple <>`适用于小集合并有其他用途,但大多数时候你最好使用具有有意义属性名称的显式类. (2认同)