首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中的字典的文字表示法?

C#中的字典的文字表示法?
EN

Stack Overflow用户
提问于 2011-02-13 04:39:37
回答 3查看 67.6K关注 0票数 204

我目前在JavaScript和用C#编程的服务器之间有一个WebSocket。在JavaScript中,我可以使用关联数组轻松地传递数据:

代码语言:javascript
复制
var data = {'test': 'val',
            'test2': 'val2'};

为了在服务器端表示这个数据对象,我使用了一个Dictionary<string, string>,但这比在JavaScript中更“输入昂贵”:

代码语言:javascript
复制
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");

在C#中是否有某种关联数组/Dictionary的文字表示法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-13 04:42:33

您使用了collection initializer语法,但是您仍然需要首先创建一个new Dictionary<string, string>对象,因为快捷语法会被转换为一堆Add()调用(就像您的代码一样):

代码语言:javascript
复制
var data = new Dictionary<string, string>
{
    { "test", "val" }, 
    { "test2", "val2" }
};

在C# 6中,您现在可以选择对字典以及任何其他支持indexers的类型使用更直观的语法。上面的语句可以重写为:

代码语言:javascript
复制
var data = new Dictionary<string, string>
{
    ["test"] = "val",
    ["test2"] = "val2"
};

与集合初始化器不同,它在幕后调用索引器设置器,而不是适当的Add()方法。

票数 327
EN

Stack Overflow用户

发布于 2015-02-04 02:08:09

虽然,字典初始化器的答案是完全正确的,但我想指出另一种方法(但我可能不推荐这样做)。如果你的目标是提供简洁的API用法,你可以使用匿名对象。

代码语言:javascript
复制
var data = new { test1 = "val", test2 = "val2"};

因此,"data“变量是一个”无法描述“的匿名类型,因此只能将其作为System.Object传递。然后,您可以编写代码,将匿名对象转换为字典。这样的代码将依赖于反射,这可能会很慢。但是,您可以使用System.Reflection.EmitSystem.Linq.Expressions来编译和缓存委托,这将使后续调用速度更快。

在我见过的许多地方,Asp.net MVC都使用了这种技术。许多Html Helper都有接受对象或字典的重载。我假设他们的API设计的目标和你所追求的是一样的;在方法调用中使用简洁的语法。

票数 14
EN

Stack Overflow用户

发布于 2015-09-09 05:32:43

使用DynamicObject,创建一个更简单的字典初始化器并不困难。

假设您想要调用以下方法

代码语言:javascript
复制
void PrintDict(IDictionary<string, object> dict) {
    foreach(var kv in dict) {
        Console.WriteLine ("  -> " + kv.Key + " = " + kv.Value);
    }
}

使用文字语法,如

代码语言:javascript
复制
var dict = Dict (Hello: "World", IAm: "a dictionary");
PrintDict (dict);

这可以通过创建动态对象来实现,如下所示

代码语言:javascript
复制
dynamic Dict {
    get {
        return new DynamicDictFactory ();
    }
}

private class DynamicDictFactory : DynamicObject
{
    public override bool TryInvoke (InvokeBinder binder, object[] args, out object result)
    {
        var res = new Dictionary<string, object> ();
        var names = binder.CallInfo.ArgumentNames;

        for (var i = 0; i < args.Length; i++) {
            var argName = names [i];
            if(string.IsNullOrEmpty(argName)) throw new ArgumentException();
            res [argName] = args [i];
        }
        result = res;
        return true;
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4980500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档