2010-10-20 10 views
6

Ho bisogno di organizzare un dizionario in cui la chiave sarebbe una coppia di enum e int e il valore è oggetto. Quindi voglio mappare una coppia con un oggetto.Come utilizzare la chiave composta per il dizionario?

Una possibilità sarebbe quella

public enum SomeEnum 
{ 
value1, value2 
} 

class Key 
{ 
    public SomeEnum; 
    public int counter; 

    // Do I have to implement Compare here? 
} 

Dictionary<SomeEnum, object> _myDictionary; 

Un'altra opzione sarebbe convertire enum e int in una certa chiave univoca.

string key = String.Format("{0}/{1}", enumValue, intValue) 

Questo approccio richiede l'analisi delle stringhe, molto lavoro extra.

Come farlo facilmente?

+1

Quale versione di C# stai utilizzando? –

+0

Visual Studio 2008 quindi penso che sia 3.5 –

+2

C# 3, .NET è 3.5 – Mike

risposta

9

Vorrei andare con qualcosa di simile a

public enum SomeEnum 
{ 
value1, value2 
} 

public struct Key 
{ 
    public SomeEnum; 
    public int counter; 
} 

Dictionary<Key, object> 

Penso che renderebbe?

+0

Sì, questo è di gran lunga il più semplice :) – leppie

+0

Come due chiavi sarebbero confrontate dal dizionario? Utilizza == o IComparable? –

+1

È un tipo di valore, quindi eseguirà solo un ==. Non sono sicuro dei sistemi a 32 bit, ma su un sistema a 64 bit penso che sarebbe sufficiente confrontare due posizioni di memoria dal momento che l'enum e l'int si adatterà a 64 bit, è un'operazione a basso costo. Su 32 bit probabilmente (?) Richiedono qualche altra istruzione? – Onkelborg

7

Se si utilizza C# 4.0, è possibile utilizzare la classe Tuple.

var key = Tuple.Create(SomeEnum.Value1, 3); 
+1

Sì, ma non è stato digitato correttamente, ovvero non è stata descritta la funzione della chiave. Ma sì, è possibile – Onkelborg

+1

È fortemente digitato - la chiave è di tipo 'Tuple '. –

+1

Quindi il tuo dizionario potrebbe essere definito come 'Dictionary , object>' –

8

Se avete intenzione di mettere questo in un dizionario, allora è necessario assicurarsi di implementare un significativo .Equals e .GetHashCode o il dizionario non si comportano correttamente.

Avvio con qualcosa di simile alla chiave composta di base, quindi implementare un IComparer personalizzato per ottenere l'ordinamento necessario.

public class MyKey 
{ 
    private readonly SomeEnum enumeration; 
    private readonly int number; 

    public MyKey(SomeEnum enumeration, int number) 
    { 
     this.enumeration = enumeration; 
     this.number = number; 
    } 

    public int Number 
    { 
     get { return number; } 
    } 

    public SomeEnum Enumeration 
    { 
     get { return enumeration; } 
    } 

    public override int GetHashCode() 
    { 
     int hash = 23 * 37 + this.enumeration.GetHashCode(); 
     hash = hash * 37 + this.number.GetHashCode(); 

     return hash; 
    } 

    public override bool Equals(object obj) 
    { 
     var supplied = obj as MyKey; 
     if (supplied == null) 
     { 
      return false; 
     } 

     if (supplied.enumeration != this.enumeration) 
     { 
      return false; 
     } 

     if (supplied.number != this.number) 
     { 
      return false; 
     } 

     return true; 
    } 
} 
+0

Oh .. così tanto che digito ... ((( –

+2

+1 per aver menzionato il punteggio .Equals e GetHashCode. Questa è una buona ragione per usare il tipo Tupla invece di stampare la tua semplice chiave. –

+0

@Winston Smith - buon punto su Tuples –

Problemi correlati