C#中字典的文字符号?

时间:2011-02-12 20:39:37

标签: c# dictionary literals

我目前在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是否有某种文字表示法?

3 个答案:

答案 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.EmitSystem.Linq.Expressions来编译和缓存将更快地进行后续调用的委托。

Asp.net MVC API在我见过的很多地方使用这种技术。许多Html助手都有重载,可以接受对象或字典。我认为他们的API设计的目标与你所追求的相同;在方法调用中简化语法。

答案 2 :(得分:0)

使用字典文字(C#9建议)

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)上关注此问题。