Ich habe derzeit ein WebSocket zwischen JavaScript und einem in C # programmierten Server. In JavaScript kann ich Daten einfach mit einem assoziativen Array übergeben:
var data = {'test': 'val',
'test2': 'val2'};
Um dieses Datenobjekt auf der Serverseite darzustellen, verwende ich a Dictionary<string, string>
, aber dies ist "typenintensiver" als in JavaScript:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
Gibt es eine Art Literalnotation für assoziative Arrays Dictionary
in C #?
c#
dictionary
literals
pimvdb
quelle
quelle
Antworten:
Sie verwenden die Auflistungsinitialisierersyntax , müssen jedoch
new Dictionary<string, string>
zuerst ein ObjektAdd()
erstellen, da die Verknüpfungssyntax in eine Reihe von Aufrufen (wie Ihren Code) übersetzt wird:In C # 6 haben Sie jetzt die Möglichkeit, eine intuitivere Syntax mit Dictionary sowie mit jedem anderen Typ zu verwenden, der Indexer unterstützt . Die obige Aussage kann wie folgt umgeschrieben werden:
Im Gegensatz zu Sammlungsinitialisierern wird hierdurch der Indexer-Setter unter der Haube und nicht eine geeignete
Add()
Methode aufgerufen.quelle
Dictionary<string, string>
? Es scheint ziemlich überflüssig, aber ich könnte mich irren. Bearbeiten: Dies scheint in der Tat ein bevorzugterer Weg zu sein, danke.var
, der Compiler wird den Typ aus dem ableitennew
. Ich habe meine Antwort bearbeitet.Dictionary<string, string>
. Mein Code deklarierte ursprünglich den Typ, ich hatte ihn geradevar
nach seinem Kommentar geändert .Die Antwort auf den Wörterbuchinitialisierer ist zwar völlig korrekt, es gibt jedoch einen anderen Ansatz, auf den ich hinweisen möchte (den ich jedoch möglicherweise nicht empfehle). Wenn Sie eine knappe API-Nutzung wünschen, können Sie anonyme Objekte verwenden.
Die Variable "data" ist dann von einem "unaussprechlichen" anonymen Typ, sodass Sie dies nur als weitergeben können
System.Object
. Sie könnten dann Code schreiben, der ein anonymes Objekt in ein Wörterbuch umwandeln kann. Ein solcher Code würde auf Reflexion beruhen, die möglicherweise langsam wäre. Sie können jedoch einen Delegaten verwendenSystem.Reflection.Emit
oderSystem.Linq.Expressions
kompilieren und zwischenspeichern, um nachfolgende Aufrufe viel schneller auszuführen.Asp.net MVC-APIs verwenden diese Technik an einer Reihe von Stellen, die ich gesehen habe. Viele der HTML-Helfer haben Überladungen, die entweder ein Objekt oder ein Wörterbuch akzeptieren. Ich gehe davon aus, dass das Ziel ihres API-Designs dasselbe ist wie das, wonach Sie suchen. knappe Syntax beim Methodenaufruf.
quelle
Mit
DynamicObject
ist es nicht so schwierig, einen einfacheren Wörterbuchinitialisierer zu erstellen.Stellen Sie sich vor, Sie möchten die folgende Methode aufrufen
mit einer wörtlichen Syntax wie
Dies kann erreicht werden, indem ein dynamisches Objekt wie dieses erstellt wird
quelle
Verwenden Sie Wörterbuchliterale (C # 9-Vorschlag)
C # 9 führt eine einfachere Syntax ein, um initialisierte
Dictionary<TKey,TValue>
Objekte zu erstellen , ohne den Namen des Wörterbuchtyps oder die Typparameter angeben zu müssen. Die Typparameter für das Wörterbuch werden unter Verwendung der vorhandenen Regeln abgeleitet, die für die Inferenz des Array-Typs verwendet werden.Diese Synthax vereinfacht die Arbeit mit Wörterbüchern in C # und entfernt den redundanten Code.
Sie können das Problem auf GitHub verfolgen (und hier ist der Meilenstein für C # 9 ).
Bearbeiten: Dieser Vorschlag wird derzeit abgelehnt :
quelle