2012-06-22 21 views
9

Quindi in C# l'istruzione switch supporta solo tipi interi (non Guids), quindi una semplice tabella di confronto O (1) non sembra possibile.Il modo più efficiente per attivare una guida in C#

Qual è il modo più efficiente computazionalmente per abbinare su un Guid

In un primo momento ho pensato

if(gMyGuid == new Guid("VALUE")) 
else if (gMyGuid == new Guid("VALUE2") 
else if (gMyGuid == new Guid("VALUE3") 
... 
else if (gMyGuid == new Guid("VALUEn") 

Tuttavia in questo modo Sto creando una nuova istanza della Guid ogni volta per un confronto . Potrei convertire il Guid in una stringa, quindi confrontarlo sulla stringa, ma il confronto tra stringhe è una stringa piuttosto lunga per il confronto.

Qualsiasi consiglio è ben accetto.

+3

confrontare la rappresentazione stringa invece? – chiccodoro

+2

L'istruzione C# 'switch' non supporta solo i tipi interi. Ad esempio, supporta anche le stringhe. Tuttavia, richiede che le etichette dei casi da testare siano conosciute al momento della compilazione. –

+1

oppure si definiscono i GUID che si desidera confrontare solo una volta e riutilizzarli ogni volta che si esegue il confronto. In questo modo puoi contare sulle persone che hanno implementato il confronto del GUID per ottimizzarlo. – chiccodoro

risposta

17

È possibile creare un System.Collections.Generic.Dictionary<Guid, ...> dove ... è qualcosa di utile a voi.

All'avvio del programma, riempire il dizionario con i guidi e i valori che è necessario riconoscere.

Quindi, utilizzare il metodo TryGetValue del dizionario per recuperare un valore tramite il suo guid.

Non ho dichiarato nulla di letterale per ... perché non so cosa vuoi fare con i guids. Forse si desidera eseguire alcune funzioni, quindi un puntatore del metodo (Func<T> o qualcosa del genere) potrebbe essere appropriato oppure un tipo di interfaccia che fornisce il metodo che si desidera richiamare. Questo dipende dal contesto/scopo di quel codice di confronto guida.

+4

Se non si ha realmente un valore a cui è necessario abbinare, è sufficiente utilizzare un 'HashMap ' invece di un 'dizionario'. Sospetto che tu lo faccia, comunque, perché lo stai usando in una catena if/else. –

+0

Un dizionario di funzioni è simile al modello di strategia e l'utilizzo di questo approccio causerà problemi a sé: http://stackoverflow.com/questions/2316189/guid-newguid-gethashcode-for-db – oasten

3

Creare i valori di confronto come statici in modo da averli creati una sola volta.

Nella parte superiore della vostra classe aggiuntivo:

private static Guid guidVal1 = new Guid("VALUE"); 

E poi nel metodo:

if(gMyGuid == guidVal1) 
else if .... 
+0

Spiacente, questo è probabilmente il mio cattivo esempio, ho aggiornato il problema, non c'è solo 1 guida per il comparatore, ce ne sono alcuni, quindi dovrei creare un nuovo guid per ogni comparatore che è il problema che sto provando evitare. –

2

Se sei veramente preoccupato per le prestazioni, i costruttori che utilizzano argomenti numerici sono più veloci il costruttore Guid(string). Nessuna stringa coinvolta e nessuna necessità di analizzare nulla.

Questa è l'implementazione di uno di loro:

public Guid(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k) 
{ 
    this._a = a; 
    this._b = b; 
    this._c = c; 
    this._d = d; 
    this._e = e; 
    this._f = f; 
    this._g = g; 
    this._h = h; 
    this._i = i; 
    this._j = j; 
    this._k = k; 
} 

Certo, non è così bello da guardare, ma penso che sia il costruttore più veloce possibile. Inoltre, è possibile memorizzare tutti i Guids di confronto in un Dictionary e utilizzare i valori in esso per memorizzare un gestore per ciascuno.

1

Non so da dove provengano i GUID, ma è possibile considerare il refactoring del codice nel modello di strategia per renderlo più gestibile come menzionato da un commentatore.

questo articolo è una buona sintesi:

http://jeremyjarrell.org/archive/2007/10/28/64.aspx

+0

Questo è solo uno scenario di test case, non un'implementazione real world :) –

1

mi piacerebbe creare un HashSet (T) di GUID, inizializzare all'avvio.

Invece del lengty 'se, se, se' si ottiene un

if (GuidHashSet.Contains(gMyGuid)) {} 

e si potrebbe aggiungere nuovi GUID alla HashSet se necessario. HashSet Contains() è un'operazione O (1).

Rendili tutti Guidi (solo una volta) come Guida == Guid utilizza i dati interni della Guida per confrontarli (è uguale a overload in Guid.cs). Quindi la guida di confronto == Guid è la più veloce. Che cosa farà l'HastSet.

Problemi correlati