我目前在JavaScript和用C#编程的服务器之间有一个WebSocket。在JavaScript中,我可以使用关联数组轻松传递数据:
var data = {'test': 'val',
'test2': 'val2'};
要在服务器端表示此数据对象,我使用的是Dictionary<string, string>
,但这比JavaScript中的“打字更贵”更多:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
C#中的关联数组/ Dictionary
是否有某种文字表示法?
答案 0 :(得分:260)
您使用collection initializer语法,但仍需要首先创建new Dictionary<string, string>
对象,因为快捷语法被转换为一堆Add()
调用(如您的代码):< / p>
var data = new Dictionary<string, string>
{
{ "test", "val" },
{ "test2", "val2" }
};
在C#6中,您现在可以选择使用更直观的语法和Dictionary以及支持indexers的任何其他类型。上述陈述可以改写为:
var data = new Dictionary<string, string>
{
["test"] = "val",
["test2"] = "val2"
};
与集合初始值设定项不同,它会调用索引器设置器,而不是适当的Add()
方法。
答案 1 :(得分:12)
虽然字典初始化程序的答案是完全正确的,但我还是会指出另一种方法(但我可能不推荐它)。如果您的目标是提供简洁的API使用,则可以使用匿名对象。
var data = new { test1 = "val", test2 = "val2"};
“data”变量是“无法形容的”匿名类型,因此您只能将其传递为System.Object
。然后,您可以编写可以将匿名对象转换为字典的代码。这样的代码将依赖于反射,这可能会很慢。但是,您可以使用System.Reflection.Emit
或System.Linq.Expressions
来编译和缓存将更快地进行后续调用的委托。
Asp.net MVC API在我见过的很多地方使用这种技术。许多Html助手都有重载,可以接受对象或字典。我认为他们的API设计的目标与你所追求的相同;在方法调用中简化语法。
答案 2 :(得分:0)
C#9引入了一种更简单的语法来创建初始化的Dictionary<TKey,TValue>
对象,而不必指定Dictionary类型名称或type参数。使用用于数组类型推断的现有规则来推断字典的类型参数。
// C# 1..8
var x = new Dictionary <string,int> () { { "foo", 4 }, { "bar", 5 }};
// C# 9
var x = ["foo":4, "bar": 5];
此synthax简化了C#中的词典的工作,并删除了冗余代码。
您可以在GitHub(这里是milestone for C#9)上关注此问题。