В настоящее время у меня есть WebSocket между JavaScript и сервером, запрограммированным на C #. В JavaScript я могу легко передавать данные, используя ассоциативный массив:
var data = {'test': 'val',
'test2': 'val2'};
Для представления этого объекта данных на стороне сервера я использую a Dictionary<string, string>
, но это более «дорого печатает», чем в JavaScript:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
Есть ли какая-нибудь буквальная запись для ассоциативных массивов / Dictionary
с в C #?
c#
dictionary
literals
pimvdb
источник
источник
Ответы:
Вы используете синтаксис инициализатора коллекции , но вам все равно нужно
new Dictionary<string, string>
сначала создать объект, так как синтаксис ярлыка преобразуется в группуAdd()
вызовов (например, ваш код):В C # 6 у вас теперь есть возможность использовать более понятный синтаксис со словарем, а также любой другой тип, который поддерживает индексаторы . Вышеупомянутое утверждение может быть переписано как:
В отличие от инициализаторов коллекции, это вызывает установщик индексатора под капотом, а не соответствующий
Add()
метод.источник
Dictionary<string, string>
хотя бы одно ? Это кажется излишним, но я могу ошибаться. Изменить: Это кажется более предпочтительным способом, спасибо.var
, компилятор выведет тип изnew
. Я отредактировал свой ответ.Dictionary<string, string>
. Мой код первоначально объявил тип, я просто изменил егоvar
после его комментария.Хотя ответ инициализатора словаря является полностью правильным, есть другой подход, на который я хотел бы обратить внимание (но я бы не рекомендовал его). Если ваша цель - обеспечить краткое использование API, вы можете использовать анонимные объекты.
В этом случае переменная «data» имеет «невыразимый» анонимный тип, так что вы можете передать это только как
System.Object
. Затем вы можете написать код, который может преобразовать анонимный объект в словарь. Такой код будет опираться на рефлексию, которая потенциально будет медленной. Однако вы можете использоватьSystem.Reflection.Emit
илиSystem.Linq.Expressions
компилировать и кэшировать делегат, который сделает последующие вызовы намного быстрее.API MVC Asp.net используют эту технику во многих местах, которые я видел. Многие Html-помощники имеют перегрузки, которые принимают либо объект, либо словарь. Я предполагаю, что цель их API-дизайна такая же, как и вы; краткий синтаксис при вызове метода.
источник
Используя
DynamicObject
, это не так сложно создать простой инициализатор словаря.Представьте, что вы хотите вызвать следующий метод
используя буквальный синтаксис, такой как
Этого можно достичь, создав такой динамический объект
источник
Используйте словарь литералов (предложение C # 9)
В C # 9 введен более простой синтаксис для создания инициализированных
Dictionary<TKey,TValue>
объектов без указания имени типа словаря или параметров типа. Параметры типа для словаря выводятся с использованием существующих правил, используемых для вывода типа массива.Этот синтакс упрощает работу со словарями в C # и удаляет лишний код.
Вы можете следить за проблемой на GitHub (и вот веха для C # 9 ).
Изменить: это предложение в настоящее время отклонено :
источник