14 Stimmen

Was schneller/effizienter ist: Dictionary<string,object> oder Dictionary<enum,object>?

Sind enum Typen schneller/effizienter als String Typen, wenn sie als Wörterbuchschlüssel verwendet werden?

IDictionary<string,object> or IDictionary<enum,object>

Welcher Datentyp eignet sich eigentlich am besten als Wörterbuchschlüssel und warum?

Bedenken Sie Folgendes: HINWEIS: Der Einfachheit halber nur 5 Eigenschaften

struct MyKeys
{
   public string Incomplete = "IN"; 
   public string Submitted = "SU"; 
   public string Processing="PR"; 
   public string Completed = "CO"; 
   public string Closed = "CL";   
}

y

enum MyKeys
{
   Incomplete, 
   Submitted, 
   Processing, 
   Completed, 
   Closed
}

Welche der oben genannten Begriffe sind besser geeignet, wenn sie als Schlüssel in einem Wörterbuch verwendet werden!

0 Stimmen

Hat C# ein Äquivalent von Javas EnumMap?

14voto

mmx Punkte 400975

Sicherlich ist die enum Version besser ist (wenn beide anwendbar und sinnvoll sind, natürlich). Nicht nur für die Leistung (es kann besser oder schlechter sein, siehe den sehr guten Kommentar von Rashack) da sie bei der Kompilierung überprüft wird und zu einem saubereren Code führt.

Sie können das Problem mit dem Komparator umgehen, indem Sie Dictionary<int, object> und Gießen enum Tasten zu int s oder die Angabe eines benutzerdefinierten Komparators.

9 Stimmen

In Bezug auf die Leistung mag das (überraschenderweise) nicht wirklich zutreffen. ayende.com/Blog/archive/2009/02/21/

1 Stimmen

Sie können jederzeit einen eigenen Komparator angeben. Das ist kein Problem mit Dictionary oder enum, aber der Komparator

6voto

JaredPar Punkte 699699

Ich denke, Sie sollten sich zunächst auf die Korrektheit konzentrieren. Dies ist viel wichtiger als der minimale Unterschied zwischen den geringfügigen Leistungsunterschieden, die in Ihrem Programm auftreten können. In diesem Fall würde ich mich auf die richtige Darstellung Ihrer Typen konzentrieren (enum scheint am besten zu sein). Später sollten Sie dann ein Profil Ihrer Anwendung erstellen, und wenn es ein Problem gibt, dann und nur dann sollten Sie es beheben.

Die Beschleunigung des Codes im weiteren Verlauf des Prozesses ist in der Regel ein einfacher Prozess. Nehmen Sie den Link, den skolima bereitgestellt hat. Hätten Sie sich für enum entschieden, wäre es ein etwa 10-minütiger Fix gewesen, eine potencial Leistungsproblem in Ihrer Anwendung. Ich möchte hier das Wort "potenziell" betonen. Dies war definitiv ein Problem für NHibernate, aber ob es ein Problem für Ihr Programm ist oder nicht, hängt allein von den Anwendungen ab.

Andererseits ist es tendenziell schwieriger, den Code später im Prozess zu korrigieren. Wenn das Problem groß genug ist, wird man feststellen, dass die Leute anfangen, sich von den Nebenwirkungen des früheren schlechten Verhaltens abhängig zu machen. Das kann es schwierig machen, Code zu korrigieren, ohne andere Komponenten zu zerstören.

3voto

skolima Punkte 30692

Verwenden Sie enum, um einen saubereren und schöneren Code zu erhalten, aber denken Sie daran, einen benutzerdefinierten Komparator bereitzustellen, wenn Sie auf die Leistung achten: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx .

-1voto

Steve Punkte 11396

Ich würde vermuten, dass die Enum-Version schneller ist. Unter der Haube referenziert das Wörterbuch alles per Hashcode. Ich vermute, dass es langsamer ist, den Hashcode für eine Zeichenkette zu generieren. Dies ist jedoch wahrscheinlich vernachlässigbar langsamer und mit Sicherheit schneller als ein Stringvergleich. Ich stimme den anderen Postern zu, die sagten, dass eine Enum sauberer ist.

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