2010-04-11 13 views
16

Voglio usare alcune funzionalità di Python come Tuples e Sets in C#. dovrei implementarli? o ci sono già stati implementati? qualcuno potrebbe conoscere una libreria di strutture dati dinamiche per i linguaggi .net?Come simulare tuple e set in C#?

risposta

14

.NET 3.5 ha HashSet.

.NET 4.0 avrà una classe Tuple. Come notato nell'articolo, la versione precedente di .NET contiene KeyValuePair < TKey, TValue> che è simile a una Tupla < T1, T2>, con la differenza principale che KeyValuePair richiede che TKey sia univoco.

+0

"... che è proprio come una tupla", anche se un solo 2-tuple. – Thomas

+0

@Thomas Sì, intendevo specificare una tupla di 2 elementi. Modificato e risolto. Grazie. –

+0

keyvaluepair non è mai una tupla. pls edit it .. – nawfal

3

Per i set, HashSet (una funzionalità .NET 3.5) risolvono il problema abbastanza bene.

una risposta parziale, per le tuple:

  • .NET 4.0 fornisce [alcune] supporto per tuples.
  • Le versioni precedenti di C# possono utilizzare il tipo anonimo (credo introdotto in .Net 2.0, 3.0 di sicuro, con tutto il materiale LINQ).

Nessuno di questi approcci è conveniente come con Python; l'handicap principale deriva dal fatto che C# è tipizzato staticamente. Tuttavia la classe Tuple C# 4.0 ha metodi statici di tipo factory che rendono più semplice la creazione di tuple (fino a 8 tuple, cioè tuple con 8 membri). Ad esempio uno può avere

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

L'utilizzo di tipo anonimo può essere eseguito come segue. Il principale svantaggio di questo approccio è che bisogna nominare esplicitamente gli elementi del "tupla" (anche se questa denominazione può essere implicitamente "proiettata" se i valori utilizzati per l'inizializzazione vengono "proiettati" da un altro oggetto.

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

@mjv: C# è un linguaggio tipicamente più * staticamente *. Sia C# che Python sono fortemente tipizzati. – quamrana

+0

@quamrana: giustissimo. Ecco cosa intendevo; ora modificato di conseguenza. – mjv

+0

sono stati aggiunti tipi anonimi in C# 3.0/.NET 3.5. .NET 3.0 era solo roba BCL, nessuna modifica alle lingue –

1

Se si sta lavorando con .NET Framework in precedenza rispetto a quanto già accennato, potrebbe rivelarsi interessante un certo numero di Wintellect Power Collections, ovvero Pair e Triple per tuple di 2 e 3 e raccolte come Set, Bag e Ordered di entrambi.

Ovviamente, non c'è nulla che ti impedisca di implementare la versione 4.0 Tuple da soli.

(A proposito, non c'è niente di particolarmente 'dinamica' su strutture di dati come questi di per sé)