По какой-то причине я пытаюсь реализовать инструмент сглаживания кортежей различного типа со следующими требованиями:
Вложенный
TupleобъектTuple<Tuple<...>>можно развернуть вTuple<...>.Во вложенных
Tupleобъект.Тип возврата установлен на
Tuple<...>(не общийobject).
я проверил как сгладить вложенные кортежи в с #?. Ответ JuanR хорошо, но тот же тип указан в Tuple. В результате следующие TupleFlattener был реализован.
Экспериментальная реализация
public static class TupleFlattener
{
public static Tuple<T1> Perform<T1>(in Tuple<Tuple<T1>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1>(input.Item1.Item1);
}
public static Tuple<T1, T2> Perform<T1, T2>(in Tuple<Tuple<T1, T2>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1, T2>(input.Item1.Item1, input.Item1.Item2);
}
public static Tuple<T1, T2, T3> Perform<T1, T2, T3>(in Tuple<Tuple<T1, T2, T3>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1, T2, T3>(input.Item1.Item1, input.Item1.Item2, input.Item1.Item3);
}
public static Tuple<T1, T2, T3, T4> Perform<T1, T2, T3, T4>(in Tuple<Tuple<T1, T2, T3, T4>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1, T2, T3, T4>(input.Item1.Item1, input.Item1.Item2, input.Item1.Item3, input.Item1.Item4);
}
public static Tuple<T1, T2, T3, T4, T5> Perform<T1, T2, T3, T4, T5>(in Tuple<Tuple<T1, T2, T3, T4, T5>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1, T2, T3, T4, T5>(input.Item1.Item1, input.Item1.Item2, input.Item1.Item3, input.Item1.Item4, input.Item1.Item5);
}
public static Tuple<T1, T2, T3, T4, T5, T6> Perform<T1, T2, T3, T4, T5, T6>(in Tuple<Tuple<T1, T2, T3, T4, T5, T6>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1, T2, T3, T4, T5, T6>(input.Item1.Item1, input.Item1.Item2, input.Item1.Item3, input.Item1.Item4, input.Item1.Item5, input.Item1.Item6);
}
public static Tuple<T1, T2, T3, T4, T5, T6, T7> Perform<T1, T2, T3, T4, T5, T6, T7>(in Tuple<Tuple<T1, T2, T3, T4, T5, T6, T7>> input)
{
if (input is null) throw new ArgumentNullException(nameof(input));
return new Tuple<T1, T2, T3, T4, T5, T6, T7>(input.Item1.Item1, input.Item1.Item2, input.Item1.Item3, input.Item1.Item4, input.Item1.Item5, input.Item1.Item6, input.Item1.Item7);
}
}
Тестовые кейсы
Tuple<Tuple<int, char, double>> tupleInput =
new Tuple<Tuple<int, char, double>>(new Tuple<int, char, double>(10, 'a', 5.5));
var output = TupleFlattener.Perform(tupleInput);
Console.WriteLine($"Output type: {output.GetType()}");
Console.WriteLine($"Item1: {output.Item1}");
Console.WriteLine($"Item2: {output.Item2}");
Console.WriteLine($"Item3: {output.Item3}");
Результат вышеуказанного теста:
Output type: System.Tuple`3[System.Int32,System.Char,System.Double]
Item1: 10
Item2: a
Item3: 5.5
Если есть какие-то улучшения, пожалуйста, дайте мне знать.
