Me encantan las tuplas . Le permiten agrupar rápidamente información relevante sin tener que escribir una estructura o clase para ella. Esto es muy útil al refactorizar código muy localizado.
Sin embargo, inicializar una lista de ellos parece un poco redundante.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
¿No hay una mejor manera? Me encantaría una solución similar a la del inicializador de Diccionario .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
¿No podemos usar una sintaxis similar?
Dictionary
no permite claves duplicadas.Respuestas:
c # 7.0 te permite hacer esto:
Si no necesita un
List
, pero solo una matriz, puede hacer:Y si no te gusta "Item1" y "Item2", puedes hacer:
o para una matriz:
que te permite hacer:
tupleList[0].Index
ytupleList[0].Name
Marco 4.6.2 y abajo
Debe instalar
System.ValueTuple
desde el Administrador de paquetes Nuget.Marco 4.7 y superior
Está integrado en el marco. No , no instalar
System.ValueTuple
. De hecho, elimínelo y elimínelo del directorio bin.nota: en la vida real, no podría elegir entre vacas, pollos o aviones. Estaría realmente desgarrado.
fuente
System.ValueTuple
admite core 2.0. Pero, pruébelo sin Nuget primero, ya que los paquetes innecesarios pueden causar problemas. Entonces, de una forma u otra, sí. Use c # v7 o superior si es posible.¡Si! Esto es posible .
Esto le permite hacer lo siguiente:
fuente
groceryList[0] == groceryList[1]
o hay que implementar una comparación?C # 6 agrega una nueva característica solo para esto: extensión Agregar métodos. Esto siempre ha sido posible para VB.net, pero ahora está disponible en C #.
Ahora no tiene que agregar
Add()
métodos a sus clases directamente, puede implementarlos como métodos de extensión. Al extender cualquier tipo enumerable con unAdd()
método, podrá usarlo en expresiones de inicializador de colección. Para que ya no tenga que derivar explícitamente de las listas ( como se menciona en otra respuesta ), simplemente puede extenderlo.Esto le permitirá hacer esto en cualquier clase que implemente
IList<>
:Por supuesto, no está restringido a extender colecciones de tuplas, puede ser para colecciones de cualquier tipo específico para el que desea la sintaxis especial.
C # 7 agregará soporte para las tuplas integradas en el lenguaje, aunque serán de un tipo diferente (en su
System.ValueTuple
lugar). Por lo tanto, sería bueno agregar sobrecargas para las tuplas de valor para que también tenga la opción de usarlas. Desafortunadamente, no hay conversiones implícitas definidas entre los dos.De esta manera, la inicialización de la lista se verá aún mejor.
Pero en lugar de pasar por todos estos problemas, podría ser mejor cambiar a usar
ValueTuple
exclusivamente.fuente
TupleList<int, string>.
más legible queList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Puede hacer esto llamando al constructor cada vez que es ligeramente mejor
fuente
Tuple.Create
en su lugar y puede inferir los argumentos de tipoAntigua pregunta, pero esto es lo que normalmente hago para que las cosas sean un poco más legibles:
fuente
Super Duper Old, lo sé, pero agregaría mi parte sobre el uso de Linq y la continuación de lambdas en los métodos con el uso de C # 7. Intento usar tuplas con nombre como reemplazos para DTO y proyecciones anónimas cuando se reutilizan en una clase. Sí, para burlarse y probar aún necesita clases, pero hacer las cosas en línea y pasar en una clase es bueno tener esta nueva opción en mi humilde opinión. Puedes instanciarlos desde
fuente
¿Por qué te gustan las tuplas? Es como los tipos anónimos: sin nombres. No se puede entender la estructura de los datos.
Me gustan las clases clasicas
fuente
Creo que una técnica es un poco más fácil y que no se ha mencionado antes aquí:
Creo que es un poco más limpio que:
fuente
var
o no. Personalmente, prefiero escribir explícitamente (cuando no está duplicado, por ejemplo, en el constructor).fuente