2016-06-27 9 views
0

Ich bin überrascht, dass ich weder in Google noch hier auf SO eine Antwort darauf finden konnte, aber was ist der beste Weg, um einen string zu Guid unter Berücksichtigung Fall und gegebenenfalls zu vergleichen , leistungVergleichen Guid mit String

const string sid = "XXXXX-...."; // This comes from a third party library 
Guid gid = Guid.NewGuid(); // This comes from the db 

if (gid.ToString().ToLower() == sid.ToLower()) 

if (gid == new Guid(sid)) 

// Something else? 

Update: um diese Frage zwingender zu machen, änderte ich sid zu einem const ... und da Sie keine Guid const dies ist das eigentliche Problem, mit denen ich zu tun haben können.

+0

Warum profilieren Sie es nicht selbst? –

+0

Weil ich nicht weiß ob es ein "etwas anderes" gibt –

+1

Müssen Sie * sie * als Strings vergleichen? Der beste Weg, sie zu vergleichen, ist wahrscheinlich, sie als 'Guid'-Typen zu vergleichen (d. H.' Gid == new Guid (sid); '), es sei denn, du machst das Millionen Male in schneller Folge oder so. – itsme86

Antwort

6

Vergleichen Sie nicht Guid s als Zeichenfolgen, und erstellen Sie keine neue Guid Form einer Zeichenfolge, nur um es mit einer vorhandenen Guid zu vergleichen. beiseite

Performance, ist es nicht ein einziges Standardformat für eine Guid als String darstellt, so laufen Sie Gefahr, inkompatibler Formate zu vergleichen, und Sie haben Fall zu ignorieren, sei es durch String.Compare Konfiguration so zu tun, oder die Umwandlung jeder zu Kleinbuchstaben.

Eine viel idiomatische und performante Art und Weise ist ein statischen zu schaffen, nur lesbar Guid von dem konstanten Stringwert und für alle Vergleiche mit nativen Gleichheit Guid:

const string sid = "3f72497b-188f-4d3a-92a1-c7432cfae62a"; 
static readonly Guid guid = new Guid(sid); 

void Main() 
{ 
    Guid gid = Guid.NewGuid(); // As an example, say this comes from the db 

    Measure(() => (gid.ToString().ToLower() == sid.ToLower())); 
    // result: 563 ms 

    Measure(() => (gid == new Guid(sid))); 
    // result: 629 ms 

    Measure(() => (gid == guid)); 
    // result: 10 ms 

} 

// Define other methods and classes here 
public void Measure<T>(Func<T> func) 
{ 
    Stopwatch sw = new Stopwatch(); 

    sw.Start(); 
    for(int i = 1;i<1000000;i++) 
    { 
     T result = func(); 
    } 
    sw.Stop(); 

    Console.WriteLine(sw.ElapsedMilliseconds); 
} 

So String-Vergleich und eine neues Guid von der Schaffung Konstanter Wert ist 50-60-mal teurer als der Vergleich des Guid mit einem statischen, schreibgeschützten Guid, der aus dem konstanten Wert erstellt wurde.

+0

Dies ist der ideale Ansatz.Peformance Bedenken beiseite, Speichern von Daten als genau das, was es sein soll ('Guid's als' Guid's, etc.) und Sie sind weit weniger wahrscheinlich auf Probleme stoßen. –