HOWTO · Csharp

Inicializar una lista de tuplas en C#

Este artículo explora varios enfoques para inicializar de manera eficiente una lista de tuplas en C#.

En esta página

Para inicializar una lista de tuplas en C#, elige entre List<Tuple<int, string>> para tuplas de referencia y List<(int, string)> para tuplas de valor. Puedes crear las entradas con un inicializador de colección, agregarlas con Add() o proyectar una secuencia existente con LINQ. Estos tipos de tupla son distintos, así que elige el que coincida con los tipos que utiliza el resto de tu código.

Inicializar una lista de tuplas en C# con el método Tuple.Create()

Tuple.Create() crea una tupla de referencia. Un inicializador de colección permite crear varias entradas al declarar una List<Tuple<int, string>>:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var tupleList = new List<Tuple<int, string>>
        {
            Tuple.Create(1, "Apple"),
            Tuple.Create(2, "Banana"),
            Tuple.Create(3, "Cherry")
        };

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

El tipo genérico de la lista especifica los tipos de los elementos de la tupla: primero un int y luego un string. Tuple.Create() infiere esos tipos a partir de cada par de valores, y el bucle recorre las entradas en el orden en que se agregaron. Consulta la documentación del método Tuple.Create() para ver sus sobrecargas.

Inicializar una lista de tuplas en C# con la notación ()

Una lista también puede contener tuplas de valor, que se escriben con la notación (). En este ejemplo se usa List<(int, string)> para inicializar directamente tres entradas:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var tupleList = new List<(int, string)>
        {
            (1, "Apple"),
            (2, "Banana"),
            (3, "Cherry")
        };

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

Aquí, (int, string) es el tipo de elemento de la tupla de valor, y cada par entre paréntesis proporciona un elemento de la lista. Los mismos pares pueden representarse con otro tipo de elemento para la lista. Obtén más información sobre las tuplas de valor en C#.

Inicializar una lista de tuplas en C# con List<Tuple<T1, T2>> y Add()

Usa Add() cuando las entradas se reciben con el tiempo o cuando la lógica de la aplicación construye la lista. Empieza con una lista vacía y agrega cada tupla de referencia:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var tupleList = new List<Tuple<int, string>>();

        tupleList.Add(Tuple.Create(1, "Apple"));
        tupleList.Add(Tuple.Create(2, "Banana"));
        tupleList.Add(Tuple.Create(3, "Cherry"));

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

El tipo declarado de la lista determina qué tipo de tupla almacena. Cada llamada a Add() agrega una Tuple<int, string>; Tuple.Create() construye esa tupla de referencia a partir de los valores proporcionados.

Inicializar una lista de tuplas en C# con LINQ

LINQ resulta útil cuando las entradas de la tupla provienen de una secuencia existente. Select() proyecta cada número en una tupla, y ToList() materializa la secuencia proyectada como una lista:

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var tupleList = Enumerable.Range(1, 3)
            .Select(i => Tuple.Create(i, $"Fruit{i}"))
            .ToList();

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

Enumerable.Range(1, 3) proporciona los valores 1, 2 y 3. La proyección empareja cada número con una cadena, y ToList() devuelve una List<Tuple<int, string>>. Como la proyección usa Tuple.Create(), se trata de tuplas de referencia.

Conclusión

Para un conjunto fijo de valores, un inicializador de colección es conciso tanto con Tuple.Create() como con literales de tuplas de valor. Usa Add() para construir gradualmente una List<Tuple<T1, T2>>, y recurre a LINQ cuando conviertas una secuencia existente en entradas de tupla. Las tuplas de referencia (Tuple<T1, T2>) y las tuplas de valor ((T1, T2)) son tipos distintos; mantén el tipo elegido en consonancia con las API y los datos que utiliza tu código.