【问题标题】:Creating a dictionary with string,string, string,int and string,object用字符串、字符串、字符串、整数和字符串、对象创建字典
【发布时间】:2017-12-08 05:19:12
【问题描述】:

我刚刚开始使用 C#,但我有点卡住了。

如何创建包含字符串、字符串、字符串、整数和字符串、对象混合的字典?

这就是它的样子:

var values = new Dictionary<????>
{
    "key0": 
         {
         "key1": "stringValue1",
         "key2": "stringValue2",
         "key3": "stringValue3",
         "key4": 10000
         },
    "key5": "stringValue4",
    "key6": "stringValue5"
};

我使用它作为 POST 请求的主体。来自here的示例代码

var body = new FormUrlEncodedContent(values);

var url = "http://url.com/endpoint"

var resp = await client.PostAsync(url, body);

var respString = await response.Content.ReadAsStringAsync();

【问题讨论】:

  • 你用这个做什么?你能展示一个示例用法吗?
  • 这看起来不是一个有效的字典用例。有一个类集合。
  • 字典
  • @NevilleNazerane,更新了我的问题
  • @Yogi 正在调查它

标签: c#


【解决方案1】:

这就是你在评论中所说的:

请注意,我来自 JavaScript 背景,你可以用字典做任何你想做的事情。

是的,您可以在 JavaScript 中做到这一点,但您需要学习并理解 C# 是一种强类型语言。这并不意味着您必须很强大才能键入它,但这意味着类型在编译时(大部分)是已知的。请仔细阅读。

无论如何,要做你想做的事,你可以通过Dictionary 来做,但它不会很漂亮,你的 C# 开发人员也会对你不满意。那么,如何通过创建类 (OOP) 为键和值提供一些上下文。如下所示:

public class Rootobject // Give it a better name
{
    public Key0 key0 { get; set; }
    public string key5 { get; set; }
    public string key6 { get; set; }
}

public class Key0
{
    public string key1 { get; set; }
    public string key2 { get; set; }
    public string key3 { get; set; }
    public int key4 { get; set; }
}

现在你有了你的类,所以你可以创建它的一个或多个实例:

var ro = new Rootobject();
ro.key5 = "stringValue4";
ro.key6 = "stringValue5";
var key0 = new Key0();
key0.key1 = "stringValue1";
key0.key2 = "stringValue2";
key0.key3 = "stringValue3";
key0.key4 = 1000; // See we cannot put a string here. Different than JavaScript

ro.key0 = key0;

现在你想发布这个并通过网络发送它,所以你需要序列化它。但在您的情况下,您需要将其序列化为 JSON。因此,请获取NewtonSoft,这样它就可以为您完成所有繁重的工作——同样不要说您不强壮。那么你需要做的就是:

var json = JsonConvert.SerializeObject(ro);

现在json 将完全一样,您可以将其发布到任何地方:

{
  "key0": {
    "key1": "stringValue1",
    "key2": "stringValue2",
    "key3": "stringValue3",
    "key4": 1000
  },
  "key5": "stringValue4",
  "key6": "stringValue5"
}

我是如何创建课程的?

上面的类名为RootObject,您可以手动创建它,也可以让Visual Studio 为您创建。我很懒,所以我让 Visual Studio 去做。如果你很懒,请看我的回答here

【讨论】:

  • 这是什么玩笑?否决票?请解释一下,否则我将在我的余生中一无所知,而你不想那样,是吗?。
  • 非常感谢您的回答。我确实知道 C# 是一种强类型语言,并且了解什么是强类型语言......所以请随意删除你答案的那部分。我只是说我有 JS 背景,给大家一些背景
  • 我给你投了赞成票,但不确定是谁给你投了反对票。打算试试你的答案
  • @jgozal 没关系,我会留下关于 JS 的部分来帮助其他人。我知道你没有投反对票,但有人投了。不用担心,它会发生。
  • 实际上有一种方法可以处理这个非常类似于 js。关于 c# 开发人员对此不满意。有时取决于上下文。如果您很少使用数据并且它变得非常动态,那么使用Dictonary&lt;string, dynamic&gt; 仍然有意义。另一方面,如果您想在多个地方重用该对象,那么创建类并利用强类型化真的很有意义。
【解决方案2】:

查看此链接:

HttpClient PostAsJsonAsync request

你可以把它转换成

var myData = await response.Content.PostAsJsonAsync<Dictionary<string, dynamic>>(...);

那么你可以把它当作:

string myStr = myData["key5"];

虽然我建议你用结构创建一个类并在&lt;&gt;中使用类名

示例类:

class MyData {
    public MyData2 key0 { get; set; }
    public string key5 { get; set; }
    public string key6 { get; set; }
}

class MyData2 {
    public string key1 { get; set; }
    public string key2 { get; set; }
    public string key3 { get; set; }
    public int key4 { get; set; }
}

现在您可以将其用作:

 var myData = await response.Content.PostAsJsonAsync<MyData>(...);

【讨论】:

  • 你介意给我指点一些关于我应该如何制作一个具有在其中使用它的结构的类的文献吗?我希望遵循最佳做法
【解决方案3】:

您可以使用动态。但是,最后,表单 post 会将所有内容都转换为字符串,因此您可能想先将 int 和 object 转换为字符串。然后,您可以使用Dictionary&lt;string, string&gt;

        Dictionary<string, dynamic> Dict = new Dictionary<string, dynamic>();
        Dict.Add("string1", "1");
        Dict.Add("string2", 2);
        Dict.Add("string3", new object());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2012-10-11
    • 2019-03-20
    相关资源
    最近更新 更多