【问题标题】:C# Is it possible to replace my dictionary class with the contents of a text file?C# 是否可以用文本文件的内容替换我的字典类?
【发布时间】:2017-06-09 01:48:04
【问题描述】:

例如,在我的项目文件中,我的 Dictionaries.cs 包含:

 public DictionaryInit() {

        public Dictionary<int, DictionaryCheckup> H = new Dictionary<int, DictionaryCheckup>()
        {
            {180000, new DictionaryCheckup {theGrouping="H"}},
            {180001, new DictionaryCheckup {theGrouping="H"}},
            {180303, new DictionaryCheckup {theGrouping="H"}},
        };

     public Dictionary<int, DictionaryCheckup> C = new Dictionary<int, DictionaryCheckup>()
        {
            {180700, new DictionaryCheckup {theGrouping="C"}},
            {180201, new DictionaryCheckup {theGrouping="C"}},
            {180503, new DictionaryCheckup {theGrouping="C"}},
        };

      Etc.
     }

(DictionaryCheckup 是一个类,get;set;字符串 theGrouping)

这个想法是我想让我的最终用户热交换一个标准,这是有问题的字典类。如果他需要添加 Dictionary U,他只需复制文本文件中的结构,在必要时替换 Key 或 Value,然后从程序中选择它。这会加载它并在运行时替换我的字典类。这可能吗?

经过一番研究,我发现Json和序列化是这样做的一种方法,但是我对它不是很熟悉,或者与读取文本文件有什么区别。这是我找到的一个线程:How do I read and write a C# string Dictionary to a file?

在这些示例中,我不确定它们如何区分键和值。此外,我认为我无法通过它访问我的 DictionaryCheckup 类,这是 Key 的价值标准。

所以,我的问题是,为简单起见,我是否可以将我的字典类(可能按原样)写入某种文本文件,然后在运行时加载它?还是我必须创建一个var dictionary,然后根据外部文件向它添加键和值?无论如何,我可能会研究 Json 方法的序列化,我只是担心当我的程序与它无关时实现 Web 功能。

【问题讨论】:

  • 这是可能的。如果在启动期间文本文件不存在,您可以将初始字典序列化为 JSON 字符串并为此创建一个文本文件。您还可以加载文本文件的内容并将 JSON 字符串反序列化回您的字典。您的方法可能是序列化/反序列化数组或字典列表。

标签: c# parsing dictionary serialization


【解决方案1】:

它们如何区分键和值

从格式。如果您尝试这些步骤中的任何一个,生成的文件会清楚地区分键和值。

我认为我无法通过这个访问我的 DictionaryCheckup 类

您将能够做到。如果您使用 JavaScriptSerializer,请确保您遵循 requirement,类似的 requirement 存在于 JSON.NET 中。当然,如果您有复杂类型,则必须修改 Linq to XML 的答案。

将我的字典类(可能按原样)写入某种文本文件,然后在运行时加载它?

是的,您可以一次反序列化集合,无需创建空集合并一一填充。对于所有序列化方法都是如此。

【讨论】:

  • 我实际尝试了我发布的链接中的代码并成功运行它而没有错误。生成文件:我可以看到我的文件看起来像这样:{"12":{"theDescription":"Account","theClass":""},"13":{"theDescription":"Span_Year","theClass":""}, 现在,我运行反序列化以将其返回到我的字典中,并且运行也没有错误,但是,我不确定它的结果.如果我修改了我序列化的文本文件并将其读回,它所基于的字典会发生什么?这是一本新词典吗?这些值是否只是简单地添加到旧值中?
  • 会被替换
  • 啊,我明白了,非常好。所以我把它叫做和原来的一样吗?很难说,因为调试器没有更新这些信息。
  • 是的,只要按照格式,反序列化器会愉快地接受任何数据。
【解决方案2】:

您可以使用序列化将字典转换为 json 字符串,然后将其写入文本文件。然后你可以读取同一个文件并反序列化 json 字符串来取回你的字典。这是一个例子:

public static string SerializeToJSON<T>(T obj) {
    return new JavaScriptSerializer().Serialize(obj);
}

public static T DeserializeJSON<T>(string json) {
    return new JavaScriptSerializer().Deserialize<T>(json);
}

// Fake path for the example
string path = "~/myFile.json";

// Instanciates a fake dictionary for the example.
Dictionary<string,string> myDict = new Dictionary<string,string>() { new KeyValuePair("A","1") };

// Using serialisation, we save the content of our dictionary into a text file.
string json = SerializeToJSON<Dictionary<string,string>>(myDict);
File.WriteAllText(path, json);

// Then with deserialisation, we get back our old dictionary. 
Dictionary myOtherDict = Dictionary<string,string>DeserializeJSON<Dictionary<string,string>>(File.ReadAllText(path));

【讨论】:

    【解决方案3】:

    您可以使用JSON.Netserialize 将您的字典添加到JSON,然后可以将其读取并写入文件。

    JSON 只是一种以可存储方式(例如,在文件中)格式化 .Net 对象的方式。它基于 JavaScript 的语法,但与 Web 没有直接关系。

    这样的事情应该可以工作:

    // Default dictionary
    Dictionary<int, DictionaryCheckup> H = new Dictionary<int, DictionaryCheckup>()
    {
        {180000, new DictionaryCheckup {theGrouping = "H"}},
        {180001, new DictionaryCheckup {theGrouping = "H"}},
        {180303, new DictionaryCheckup {theGrouping = "H"}},
    };
    
    // Then when we plan on loading our dictionary...
    
    // Write our our default JSON if no config file exists
    if (!File.Exists("H.json"))
    {
        using (var stream = new StreamWriter(File.Create("H.json")))
        {
            // Convert our "H" dictionary into JSON
            var json = JsonConvert.SerializeObject(H, Formatting.Indented);
    
            // Write the JSON to the file
            stream.Write(json);
            stream.Flush();
        }
    }
    // Read the JSON that our user has configured
    else
    {
        using (var stream = new StreamReader(File.OpenRead("H.json")))
        {
            // Read our JSON from the file
            var json = stream.ReadToEnd();
    
            // Convert it back to a Dictionary<int, DictionaryCheckup> object and store
            // it in our "H" variable
            H = JsonConvert.DeserializeObject<Dictionary<int, DictionaryCheckup>>(json);
        }
    }
    

    上面的代码读/写的文件看起来像这样:

    {
      "180000": {
        "theGrouping": "H"
      },
      "180001": {
        "theGrouping": "H"
      },
      "180303": {
        "theGrouping": "H"
      }
    }
    

    请注意,上面的示例仅用于编写和加载单个字典。如果您愿意,您可以更改代码以存储字典数组(甚至字典的字典),然后允许通过复制粘贴添加或删除字典。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多