2014-06-17 24 views
3

谁能帮助下面的列表元组超过8个元素是不工作:列表元组超过800项

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()); 

它提供了以下错误

错误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 and Er ROR 2参数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:\用户\惠普 惠普\应用程序数据\本地\临时 项目\ WindowsFormsApplication1 \ Form1.cs中68 25 WindowsFormsApplication1

+14

除了 - 不要这样做!用相关属性等创建你自己的命名类型。 –

回答

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") 
) 
); 
11

的问题是与最后一个参数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 
) 

基本上,包装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")); 

这是相当可怕的,虽然。自己创建一些静态方法可能会更好,例如

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)); 
} 

(有,因为你需要尽可能多的重载)上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); 
} 

那么你可以使用:

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

我个人”尽量避免使用这个元组的大小 - 创建一个带有这个约束的命名类型代之以priate属性。

+1

那么这将是该工厂方法声明中的一个错误呢?我真的不明白这一点。 –

+4

@ LasseV.Karlsen:我怀疑它有一些原因,但它不完全清楚它是什么 - 在这个用例中它肯定是无益的。 –

1

在C#7

var tup = (1, 2, 3, 4, 5, 6, 7, 8, "nine"); 
var one = tup.Item1; 
var nine = tup.Item9; 
二话不说