列出元组超过8项

use*_*422 5 .net c# tuples

任何人都可以帮助以下List Tuple超过8个元素不起作用:

List<Tuple<int, string, double, string, int, string, double, Tuple<int, string>>> tpl = new 
List<Tuple<int, string, double, string, int, string, double, Tuple<int, string>>>();
tpl.Add(Tuple.Create(1, "ABC", 100.123, "XYZ", 1, "ABC", 100.123, new Tuple<int, string>(100, "My Rest Item")));

foreach(var k in tpl)
        listBox1.Items.Add(k.Item1.ToString() + " ---> " + k.Item2.ToString() + " ---> " + k.Item3.ToString() + " ---> " +
        k.Item4.ToString() + " ---> " + k.Item5.ToString() + " ---> " + k.Item6.ToString() + " ---> " +
        k.Item7.ToString() + " ---> " + k.Rest.Item1.ToString());
Run Code Online (Sandbox Code Playgroud)

它给出了以下错误

错误1' System.Collections.Generic.List<System.Tuple<int,string,double,string,int,string,double,System.Tuple<int,string>>>.Add(System.Tuple<int,string,double,string,int,string,double,System.Tuple<int,string>>)' 的最佳重载方法匹配有一些无效的参数C:\ Users\Hewlett Packard\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs 68 17 WindowsFormsApplication1和Error 2 Argument 1:无法从' System.Tuple<int,string,double,string,int,string,double,System.Tuple<System.Tuple<int,string>>>' 转换为' System.Tuple<int,string,double,string,int,string,double,System.Tuple<int,string>>'C:\ Users\Hewlett Packard\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs 68 25 WindowsFormsApplication1

Jon*_*eet 17

问题出在最后一个参数上Tuple.Create.仔细查看如何定义参数返回值:

public 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
)
Run Code Online (Sandbox Code Playgroud)

基本上,包裹 T8在一个Tuple<T8>自动- ,有点帮倒忙.

你可以new改用:

var value = new Tuple<<int, string, double, string, int, string, double,
                      Tuple<int, string>>
    (1, "ABC", 100.123, "XYZ", 1, "ABC", 100.123,
     new Tuple<int, string>(100, "My Rest Item"));
Run Code Online (Sandbox Code Playgroud)

但那真是太可怕了.自己创建一些静态方法可能更好,例如

public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8, T9>>
    Create(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9)
{
    return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8, T9>>
        (t1, t2, t3, t4, t5, t6, t7, Tuple.Create(t8, t9)); 
}
Run Code Online (Sandbox Code Playgroud)

(根据需要提供尽可能多的重载)

或者可能是一种扩展方法Tuple<T1 ... T7>:

public static Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>
    With(this Tuple<T1, T2, T3, T4, T5, T6, T7> tuple,
         TRest rest)
{
    return new Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>(
        tuple.Item1, 
        tuple.Item2, 
        tuple.Item3, 
        tuple.Item4, 
        tuple.Item5, 
        tuple.Item6, 
        tuple.Item7,
        rest);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

var value = Tuple.Create(1, "ABC", 100.123, "XYZ", 1, "ABC", 100.123)
                 .With(Tuple.Create(100, "My Rest Item"));
Run Code Online (Sandbox Code Playgroud)

我个人试图完全避免使用这个大小的元组 - 创建一个具有适当属性的命名类型.

  • @ LasseV.Karlsen:我怀疑它有**的原因,但它并不完全清楚它是什么 - 它在这个用例中肯定没有用. (5认同)

ozz*_*836 5

在 C#7 中

var tup = (1, 2, 3, 4, 5, 6, 7, 8, "nine");
var one = tup.Item1;
var nine = tup.Item9;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会创建一个 `ValueTuple` 而不是 `Tuple`。 (3认同)

Pat*_*man 3

我自己不太明白为什么,但是当您使用new Tuple<>而不是以下代码时,代码将起作用Tuple.Create

tpl.Add
( new Tuple<int, string, double, string, int, string, double, Tuple<int, string>>
  ( 1
  , "ABC"
  , 100.123
  , "XYZ"
  , 1
  , "ABC"
  , 100.123
  , Tuple.Create(100, "My Rest Item")
  )
);
Run Code Online (Sandbox Code Playgroud)