2010-04-11 15 views
16

Quiero usar algunas características de python como Tuples and Sets en C#. ¿Debería implementarlos? o ya están implementados? ¿Alguien podría saber una biblioteca de estructuras dinámicas de datos para lenguajes .net?Cómo simular tuplas y conjuntos en C#?

Respuesta

14

.NET 3.5 tiene HashSet.

.NET 4.0 tendrá una clase Tuple. Como se señala en el artículo, la versión anterior de .NET contiene KeyValuePair < TKey, TValue> que es similar a Tuple < T1, T2>, con la diferencia principal de que KeyValuePair requiere que TKey sea único.

+0

"... que es como una tupla", aunque un sólo el 2-tupla. – Thomas

+0

@Thomas Sí, quise especificar una 2-tupla. Editado y arreglado. Gracias. –

+0

keyvaluepair nunca es una tupla. pls edit it .. – nawfal

3

Para Sets, los HashSets (una característica de .NET 3.5) hacen el truco bastante bien.

Una respuesta parcial, por tuplas:

  • .NET 4.0 proporciona [algunos] soporte para tuples.
  • Las versiones anteriores de C# pueden usar el tipo anónimo (creo que se introdujo en .Net 2.0, 3.0 con seguridad, con todas las cosas de LINQ).

Ninguno de estos enfoques es tan conveniente como con Python; la principal desventaja proviene del hecho de que C# está tipado estáticamente. Sin embargo, la clase C# 4.0 Tuple tiene métodos estáticos similares a los de fábrica que facilitan la creación de tuplas (hasta 8 tuplas, es decir, tuplas con 8 miembros). Por ejemplo, uno puede tener

 
    var customer1 = Tuple.Create("John", "Smith", 14, 5.33, "202-123-444"); 

El uso del tipo anónimo se puede hacer de la siguiente manera. El principal inconveniente de este enfoque es que se necesita para nombrar explícitamente los elementos de la "tupla" (aunque esta nomenclatura puede ser implícitamente "proyectada" si los valores utilizados para la inicialización se "proyectan" de otro objeto.

 
    customer1 = new Customer { 
       Name = "John", 
       Surname = "Smith", 
       NumberOfVisits = 14, 
       CurrentBalance = 5.33, 
       PhoneNr = "202-123-444" 
    }; 
+1

@mjv: C# es un lenguaje * estático más * tipado. Tanto C# como Python están fuertemente tipados. – quamrana

+0

@quamrana: bastante bien. A eso me refería; ahora editado en consecuencia. Se agregaron – mjv

+0

tipos anónimos en C# 3.0/.NET 3.5. .NET 3.0 era solo material de BCL sin cambios en los idiomas –

1

Si está trabajando con .NET Framework antes de lo mencionado anteriormente, Wintellect Power Collections podría ser de algún interés, tiene Pair y Triple para 2- y 3-tuplas, y colecciones como Set, Bag y Ordered sabores de ambas.

Por supuesto, no hay nada que te impida implementar 4.0's Tuple usted mismo.

(Por cierto, no hay nada particularmente 'dinámica' sobre estructuras de datos como estos en sí mismos)