/ / Перерахуйте кортеж більше 8 предметів - c #, .net, кортежі

Список Tuple більше 8 елементів - c #, .net, кортежі

Чи може хтось допомогти наступному списку 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());

Це дає наступну помилку

Помилка 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:UsersHewlett PackardAppDataLocalTemporary ПроектиWindowsFormsApplication1Form1.cs 68 17 WindowsFormsApplication1 та помилка 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: UsersHewlett PackardAppDataLocalTemporary ПроектиWindowsFormsApplication1Form1.cs 68 25 WindowsFormsApplication1

Відповіді:

13 за відповідь № 1

Проблема полягає в останньому аргументі до 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"));

Особисто я намагався би повністю уникати такого розміру кортежу - замість цього створити іменований тип із відповідними властивостями.


3 для відповіді № 2

Я насправді не знаю, чому сам, але код буде працювати, коли ви використовуєте 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")
)
);

3 для відповіді № 3

У C # 7

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