12 Stimmen

Der effizienteste Weg, um eine Guid in C# einzuschalten

In C# unterstützt die switch-Anweisung nur ganzzahlige Typen (keine Guids), so dass eine einfache O(1)-Vergleichstabelle nicht möglich erscheint.

Was ist der rechnerisch effizienteste Weg, einen Guid abzugleichen?

Zuerst dachte ich

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

Dadurch erstelle ich jedoch jedes Mal eine neue Instanz der Guid für einen Vergleich. Ich könnte die Guid in eine Zeichenfolge konvertieren, dann vergleichen Sie auf die Zeichenfolge, aber die Zeichenfolge Vergleich ist eine ziemlich lange Zeichenfolge für Vergleich.

Für jeden Ratschlag sind wir dankbar.

18voto

O. R. Mapper Punkte 19373

Sie können eine System.Collections.Generic.Dictionary<Guid, ...>... ist etwas Nützliches für Sie.

Füllen Sie das Wörterbuch beim Start des Programms mit den zu erkennenden Kennungen und Werten.

Verwenden Sie dann die TryGetValue Methode des Wörterbuchs, um einen Wert anhand seiner Guid abzurufen.

Ich habe keine wörtliche Rede gehalten für ... weil ich nicht weiß, was Sie mit den Leitfäden machen wollen. Vielleicht wollen Sie eine Funktion ausführen, dann einen Methodenzeiger ( Func<T> oder etwas Ähnliches) oder ein Schnittstellentyp, der die aufzurufende Methode zur Verfügung stellt, geeignet sein. Dies hängt vom Kontext/Zweck des Guid-Vergleichscodes ab.

7voto

Manfred Wippel Punkte 1606

Mit c#7 können Sie jetzt switch mit Abgleich von Mustern zu diesem Zweck.

switch (gMyGuid )
{
    case var g when (g == new Guid("VALUE")):
        break;
    case var g when (g == new Guid("VALUE2")):
        break;
    case var g when (g == new Guid("VALUEN")):
        break;
    default:
        break;
}

Dies funktioniert auch, wenn Sie statische readonly new Guid"..") Variablen definiert haben.

3voto

Richard Hooper Punkte 784

Erstellen Sie die Vergleichswerte als statisch, damit Sie sie nur einmal erstellen.

Fügen Sie am Anfang Ihrer Klasse hinzu:

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

Und dann in Ihrer Methode:

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

2voto

Botz3000 Punkte 38010

Wenn Sie sich wirklich Sorgen um die Leistung machen, sind die Konstruktoren mit numerischen Argumenten schneller als die Guid(string) Konstrukteur. Es sind keine Zeichenketten involviert und es muss nichts geparst werden.

Dies ist die Umsetzung einer dieser Maßnahmen:

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;
}

Sicher, es ist nicht so hübsch anzusehen, aber ich denke, es ist der schnellste Konstruktor, der möglich ist. Sie könnten natürlich auch alle Ihre Vergleichs-Guids in einem Dictionary und verwenden Sie die darin enthaltenen Werte, um für jeden einen Handler zu speichern.

1voto

IvoTops Punkte 3363

Ich würde ein HashSet(T) von Guids erstellen und es beim Start initialisieren.

Anstelle des langatmigen "wenn, wenn, wenn" erhalten Sie eine

if (GuidHashSet.Contains(gMyGuid)) {}

und Sie können dem HashSet bei Bedarf neue Guids hinzufügen. HashSet Contains() ist eine O(1)-Operation.

Machen Sie sie alle Guids (nur einmal) als Guid == Guid verwendet die internen Daten der Guid, um sie zu vergleichen (equals ist überladen in Guid.cs). Der Vergleich Guid == Guid ist also am schnellsten. Was das HastSet auch tut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X