Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在本地保存整个词典并在需要时加载它?_C#_Dictionary_Save_Local - Fatal编程技术网

C# 如何在本地保存整个词典并在需要时加载它?

C# 如何在本地保存整个词典并在需要时加载它?,c#,dictionary,save,local,C#,Dictionary,Save,Local,我有一个C#程序,可以从网页中检索数据,然后将内容组织到字典中。 到目前为止,程序每次运行时都会从web获取数据,因为没有其他数据源。问题是,如果我离线,我无法检索数据,因此我没有数据可以处理。 我是否可以将整个词典保存在本地,以便在脱机时加载并运行分析 要保存的字典是myData: Dictionary<string, itemdata> myData = new Dictionary<string, itemdata>(); 因此,在我的主类中,我检索一些项目的数据

我有一个C#程序,可以从网页中检索数据,然后将内容组织到字典中。 到目前为止,程序每次运行时都会从web获取数据,因为没有其他数据源。问题是,如果我离线,我无法检索数据,因此我没有数据可以处理。 我是否可以将整个词典保存在本地,以便在脱机时加载并运行分析

要保存的字典是myData:

Dictionary<string, itemdata> myData = new Dictionary<string, itemdata>();
因此,在我的主类中,我检索一些项目的数据,然后填充:

itemdata myItemMap = new itemdata (itemWeight, itemSize, itemPrice)
并将所有内容插入字典:

myData.Add(itemName, myItemMap);
一旦检索到所有数据并将其组织到myData dictionary中,我希望将其保存在本地


谢谢你迄今为止给我的所有建议。保存到XML似乎是一个不错的选择,但我希望有一些清晰的示例来说明如何处理我的特定词典,因为它不是简单的“一个键和一个值”,而是稍微复杂一点的“一个键和多个值/字段”

您可以做的另一件事是使用内置序列化程序将其序列化为XML。要序列化的类型必须实现ISerializable。这是唯一的要求。好消息是.NET将为您处理所有其他事情。

通常,您需要创建一些自定义类对象的列表,以便能够使用XmlSerializer保存到XML中。字典不能直接序列化为XML。在这里,我提供了使用示例:

class Program
{
  static void Main(string[] args)
  {
    var myData = new Dictionary<string, ExampleDataClass>()
    {
      { "First", new ExampleDataClass() { Name = "John", Surname = "Doe" } },
      { "Second", new ExampleDataClass() { Name = "Foo", Surname = "Bar" } }
    };
    var fileName = @"C:\MyPath\dict.xml";
    myData.SaveToXml(fileName);
    myData.Clear();
    myData = MySerializer.LoadFromXml<string, ExampleDataClass>(fileName);
  }
}

public class ExampleDataClass
{
  public string Name { get; set; }
  public string Surname { get; set; }
}

public class KeyValue<TKey, TValue>
{
  public TKey Key { get; set; }
  public TValue Value { get; set; }
}

static class MySerializer
{
  public static void SaveToXml<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string fileName)
  {
    var serializer = new XmlSerializer(typeof(List<KeyValue<TKey, TValue>>));

    using (var s = new StreamWriter(fileName))
    {
      serializer.Serialize(s, dictionary.Select(x => new KeyValue<TKey, TValue>() { Key = x.Key, Value = x.Value }).ToList());
    }
  }

  public static Dictionary<TKey, TValue> LoadFromXml<TKey, TValue>(string fileName)
  {
    var serializer = new XmlSerializer(typeof(List<KeyValue<TKey, TValue>>));

    using (var s = new StreamReader(fileName))
    {
      var list = serializer.Deserialize(s) as List<KeyValue<TKey, TValue>>;
      return list.ToDictionary(x => x.Key, x => x.Value);
    }
  }
}
类程序
{
静态void Main(字符串[]参数)
{
var myData=newdictionary()
{
{“First”,新的ExampleDataClass(){Name=“John”,姓氏=“Doe”},
{“第二”,新示例DataClass(){Name=“Foo”,姓氏=“Bar”}
};
var fileName=@“C:\MyPath\dict.xml”;
SaveToXml(文件名);
myData.Clear();
myData=MySerializer.LoadFromXml(文件名);
}
}
公共类ExampleDataClass
{
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
}
公共类键值
{
公钥{get;set;}
公共TValue值{get;set;}
}
静态类MySerializer
{
公共静态void SaveToXml(此字典,字符串文件名)
{
var serializer=newxmlserializer(typeof(List));
使用(var s=newstreamwriter(文件名))
{
serializer.Serialize(s,dictionary.Select(x=>newkeyvalue(){Key=x.Key,Value=x.Value}).ToList());
}
}
公共静态字典LoadFromXml(字符串文件名)
{
var serializer=newxmlserializer(typeof(List));
使用(var s=newstreamreader(文件名))
{
var list=序列化程序。反序列化为列表;
返回list.ToDictionary(x=>x.Key,x=>x.Value);
}
}
}
这将把示例数据保存到这样的XML文件中:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfKeyValueOfStringExampleDataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <KeyValueOfStringExampleDataClass>
    <Key>First</Key>
    <Value>
      <Name>John</Name>
      <Surname>Doe</Surname>
    </Value>
  </KeyValueOfStringExampleDataClass>
  <KeyValueOfStringExampleDataClass>
    <Key>Second</Key>
    <Value>
      <Name>Foo</Name>
      <Surname>Bar</Surname>
    </Value>
  </KeyValueOfStringExampleDataClass>
</ArrayOfKeyValueOfStringExampleDataClass>

弗斯特
约翰
雌鹿
第二
福
酒吧

示例代码无法解决任何异常和无效数据。

您可能会发现这个问题很有趣:谢谢。你能告诉我用来保存字典的行代码吗。。。你应该考虑阅读一些C教程,谢谢展示一个可复制的例子。我在上面的问题中添加了一些关于我的字典结构的详细信息,因此了解如何更改静态类MySerializer的方法以使用我的字典将非常有帮助。@mickG然后您需要将仅从文件加载更改为
myData=MySerializer.LoadFromXml(文件名)因为类MySerializer是泛型的。当然,XML文件将具有不同的结构。顺便问一下,为什么使用
itemdata
而不是
itemdata
作为类的名称?C#中的总体约定是CamelCaseName。属性也是如此。
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfKeyValueOfStringExampleDataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <KeyValueOfStringExampleDataClass>
    <Key>First</Key>
    <Value>
      <Name>John</Name>
      <Surname>Doe</Surname>
    </Value>
  </KeyValueOfStringExampleDataClass>
  <KeyValueOfStringExampleDataClass>
    <Key>Second</Key>
    <Value>
      <Name>Foo</Name>
      <Surname>Bar</Surname>
    </Value>
  </KeyValueOfStringExampleDataClass>
</ArrayOfKeyValueOfStringExampleDataClass>