Saltar al contenido

Trabajando con Tuples en Csharp

Hay dos maneras de utilizar la estructura de datos tupla. Hay un enfoque basado en clases, que utiliza el constructor de la clase Tuple, y hay el método Create, también una opción viable.

Enfoque basado en la clase

Podemos utilizar la clase Tuple para crear nuestra tupla con la longitud y el tipo específico de los elementos que queremos almacenar.

Trabajando con Tuples en Csharp
Trabajando con Tuples en Csharp

Tomemos un ejemplo basado en el código.

123456789101112131415161718 que utiliza el sistema;namespace tuples{classTupling{staticvoidMain(string[] args){ Tuple<string string,int,("Daniel",28); Tuple<int,int,int,int,int,int,int, Tuple<int,MyMaxTuple =newTuple<int,int,int,int,int,int,int, Tuple<int,1,2,3,4,5,6,7, newTuple<int,8)); Consola. WriteLine($"El {nombre de(MyStringTuple)} tiene los siguientes elementos: {MyStringTuple}"); Console.WriteLine($"El {nombre de(MiTuplaDeLaCostumbre)} tiene los siguientes elementos: {MiTuplaCostumbre}"); Console.WriteLine($"El {nombre de (MiTuplaCostumbre)} tiene los siguientes elementos: {MiMáximaTupla}"); Console.ReadKey();;}}}

csharp

Inspeccionemos la salida.

123La MyStringTuple tiene los siguientes elementos: ()La MystringTuple tiene los siguientes elementos: (Daniel, 28) La Cúpula MiMáxima tiene los siguientes elementos: (1, 2, 3, 4, 5, 6, 7, 8)

bash

Se puede ver en la inicialización que tenemos tres tuplas. Una es MyStringTuple, otra es MyCustomTuple, y finalmente MyMaxTuple. Todas son únicas y proporcionan toda la información que necesitas sobre las tuplas. Cuando tienes una tupla de 8 elementos, el último elemento siempre debe ser una tupla.

Método de creación

Cuando se utiliza el enfoque basado en constructor, puede hacer que el código sea más difícil de leer porque hay que especificar el tipo de cada elemento para la tupla, y cuanto más larga sea la tupla más inundará el código. Para aliviar el dolor de los desarrolladores, el método de creación nació para la clase Tuple. Contiene métodos estáticos que permiten crear la instancia sin proporcionar el tipo de cada elemento.

Nuestro ejemplo anterior reescrito en este estilo se ve así.

123456789101112131415161718 usando el sistema;namespace tuples{classTupling{staticvoidMain(string[] args){var MyStringTuple = Tuple.Create("");var MyCustomTuple = Tuple. Create("Daniel",28);var MyMaxTuple = Tuple.Create(1,2,3,4,5,6,7, Tuple.Create(8)); Console.WriteLine($"El {nombre de(MyStringTuple)} tiene los siguientes elementos: {MiCuerdaDoble}"); Console.WriteLine($"El {nombre de (MiDobleCostumbre)} tiene los siguientes elementos: {MiTuplaCostumbre}"); Console.WriteLine($"El {nombre de (MiTuplaCostumbre)} tiene los siguientes elementos: {MiMáximaTupla}"); Console.ReadKey();}}

csharp

Esto parece más conciso y permite una mejor legibilidad para el siguiente desarrollador que trabaje en la aplicación.

Acceso a los artículos

Cuando instanciamos una nueva tupla, ya sea a través del método basado en clases o el método de creación, nuestra tupla tendrá una propiedad única. Asignará cada elemento consecutivo a una propiedad de la instancia con la siguiente lógica:

1Item<elementNumber;

bash

Esto significa que una tupla que tiene 4 elementos tendrá las siguientes propiedades:

1234Tuple.Item1Tuple.Item2Tuple.Item3Tuple.Item4

csharp

Entonces modificamos nuestro código de acuerdo con esto:

1234567891011121314151617 usando el sistema;namespace tuples{classTupling{staticvoidMain(string[] args){var MyStringTuple = Tuple.Create("");var MyCustomTuple = Tuple.Create("Daniel",28);var MyMaxTuple = Tuple.Create(1,2,3,4,5,6,7, Tuple.Create(8)); Consola. WriteLine($"El primer elemento de nuestra {MiCuerdaDoble} es {MiCuerdaDoble.Artículo1}"); Consola.WriteLine($"El primer elemento de nuestra {MiCuerdaDoble} es {MiCuerdaDoble. Item1}, el segundo es: {MiDobleCostumbre.Item2}"); Console.WriteLine($"El primer elemento de nuestra {MiDobleCostumbre} es {MiDobleCostumbre.Item1}, el último es: {MyMaxTuple.Rest}"); Console.ReadKey();}}}

csharp

Esto nos da el siguiente resultado:

123El primer elemento de nuestro () es El primer elemento de nuestro (Daniel, 28) es Daniel, el segundo es: 28El primer elemento de nuestro (1, 2, 3, 4, 5, 6, 7, (8)) es 1, el último es: ((8))

bash

Obsérvese cómo el último elemento de la tupla de ocho objetos sólo puede denominarse .resto, y siempre debe ser una tupla.

Tuplas de anidación

La limitación del máximo de ocho elementos puede superarse anidando tuplas entre sí. La mejor práctica es anidar una tupla en otra en el último elemento. Sin embargo, esto no se aplica de ninguna manera, por lo que se puede anidar una tupla en cualquier lugar dentro de otra tupla. Cuando anida al final, puede acceder a la tupla anidada a través de la propiedad .Rest; de lo contrario, necesita usar la propiedad .Item para acceder a la tupla.

Vamos a demostrarlo con un código.

1234567891011121314151617 usando el Sistema;namespace tuples{classTupling{estaticvoidMain(string[] args){var MyMaxTupleNested = Tuple.Create(1,2,3,4,5,6,7, Tuple. Crear(8,9,10,11,12,13,14, Tupla.Crear(15,16,17,18,19,20,21)); Consola.Línea de escritura($"Mi tupla original: {MyMaxTupleNested}"); Consola. WriteLine($"Primer elemento de la tupla exterior: {MyMaxTupleNested.Item1}"); Console.WriteLine($"Primer nivel de anidamiento: {MyMaxTupleNested.Rest.Item1}"); Console.WriteLine($"Segundo nivel de anidamiento: {MyMaxTupleNested.Rest.Item1.Rest.Item1}"); Console.ReadKey();}}}

csharp

La salida debería ser así:

1234Mi tupla original: (1, 2, 3, 4, 5, 6, 7, (8, 9, 10, 11, 12, 13, 14, (15, 16, 17, 18, 19, 20, 21)))Primer elemento de la tupla exterior: 1Primer nivel de anidación: (8, 9, 10, 11, 12, 13, 14, (15, 16, 17, 18, 19, 20, 21))Segundo nivel de anidación: (15, 16, 17, 18, 19, 20, 21)

bash

En mi opinión, el método de anidación en el último elemento proporciona un código claro y una forma clara de solucionar problemas. Sin embargo, puede que no sea un enfoque de «una solución para todos», porque en algunas situaciones es mejor anidar en el medio.