2010-06-08 4 views
7

Ho bisogno di qualcosa di simile a List<String, Int32, Int32>. Elenco supporta solo un tipo alla volta e Dizionario solo due alla volta. C'è un modo pulito per fare qualcosa come il precedente (una lista/collezione generica multidimensionale)?C'è qualcosa come List <String, Int32, Int32> (elenco generico multidimensionale)

+0

La duplicazione di Int32 è interessante. Cosa stai cercando di fare? –

+0

Devo associare semanticamente due numeri diversi con una stringa, che verrà quindi utilizzata per il rendering dei dati in una vista. – Alex

+0

Penso che @Alex abbia lo sfondo 'java' come me. –

risposta

14

Il modo migliore è quello di creare un contenitore per esso vale a dire una classe

public class Container 
{ 
    public int int1 { get; set; } 
    public int int2 { get; set; } 
    public string string1 { get; set; } 
} 

poi nel codice dove serve

List<Container> myContainer = new List<Container>(); 
+4

+1 poiché non richiede una tupla .Net4 e può essere implementato banalmente con una classe, ma -1 perché è necessario evitare i campi pubblici in una classe. Implementa come una proprietà e usa semplicemente '{get; impostato;} 'invece. –

+0

Probabilmente sarà necessario sostituire anche Equals e GetHashCode –

+1

tipo Container dovrebbe essere una struttura immutabile poiché rappresenta solo valori. –

13

In .NET 4 è possibile utilizzare List<Tuple<String, Int32, Int32>>.

+0

Purtroppo sono su .NET 3.5, ma terrò questo a mente per 4.0! – Alex

1

Beh, non si può fare questo fino C# 3.0, usa Tuples se puoi usare C# 4.0 come menzionato in altre risposte.

Tuttavia in C# 3.0 - creare un Immutable structure e avvolgere le insanze di tutti i tipi all'interno della struttura e passare il tipo di struttura come argomento di tipo generico all'elenco.

public struct Container 
{ 
    public string String1 { get; private set; } 
    public int Int1 { get; private set; } 
    public int Int2 { get; private set; } 

    public Container(string string1, int int1, int int2) 
     : this() 
    { 
     this.String1 = string1; 
     this.Int1 = int1; 
     this.Int2 = int2; 
    } 
} 

//Client code 
IList<Container> myList = new List<Container>(); 
myList.Add(new Container("hello world", 10, 12)); 

Se siete curiosi perché creare le strutture immutabili - checkout here.

0

In base al tuo commento, sembra che tu abbia bisogno di una struttura con due numeri interi memorizzati in un dizionario con una chiave di stringa.

struct MyStruct 
{ 
    int MyFirstInt; 
    int MySecondInt; 
} 

... 

Dictionary<string, MyStruct> dictionary = ... 
+0

Ciò presuppone che le stringhe siano intese come uniche. –