Реализация инструмента выравнивания кортежей различного типа

По какой-то причине я пытаюсь реализовать инструмент сглаживания кортежей различного типа со следующими требованиями:

  • Вложенный 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

Если есть какие-то улучшения, пожалуйста, дайте мне знать.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *