如何将字典保存到文本文件中(C#)

3

我正在尝试将字典保存到txt文件中,寻找简单的例子。能帮帮我吗?我已经尝试了这个方法,但它对我没有效果。谢谢。

Dictionary<string, int> set_names = new Dictionary<string, int>();
        //fill dictionary 
        //then do:
        StringBuilder sb =new StringBuilder();
        foreach (KeyValuePair<string, int> kvp in set_names)
        {
            sb.AppendLine(string.Format("{0};{1}", kvp.Key, kvp.Value));
        }

        string filePath = @"C:\myfile.txt";
        using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
        {
            using (TextWriter tw = new StreamWriter(fs))

请查看File.WriteAllText - juharr
@juharr:这需要将字典完全存储在RAM中。对于小量数据来说不是问题,但并非一种适用于所有情况的解决方案。 - Eric J.
@EricJ。在使用StringBuilder的示例中,它已经存储在RAM中了。此外,通过一些Linq技巧,您可以使用File.WriteAllLines而无需占用过多的RAM。 - juharr
@juharr:是的,那是不必要的。 - Eric J.
3个回答

3
你正在将字典内容写入sb中,但从未使用它。没有必要先创建字典的内存副本(即StringBuilder)。相反,在枚举字典时直接写出即可。
string filePath = @"C:\myfile.txt";
using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
{
    using (TextWriter tw = new StreamWriter(fs))

    foreach (KeyValuePair<string, int> kvp in set_names)
    {
        tw.WriteLine(string.Format("{0};{1}", kvp.Key, kvp.Value));
    }
}

3
你可以使用 File.WriteAllLines 和一些 Linq 来实现这个功能。
File.WriteAllLines(
    path, 
    dictionary.Select(kvp => string.Format("{0};{1}", kvp.Key, kvp.Value));

请注意,这将在循环字典时写入文件,因此不会使用任何额外的内存。

1
请注意:如果目标文件已经存在,它将被覆盖。这与当前的 FileMode.OpenOrCreate 的行为相同。这只是需要注意的一点。 - Eric J.

0

使用:

StreamWriter sw = new StreamWriter(YOUFILEPATHSTRING);
try
{
 foreach(KeyValuePair kvp in set_names)
 {
   sw.WriteLine(kvp.Key +";"+kvp.Value;
 }

 sw.Close();
}

catch (IOException ex)
{
 sw.Close();
}

此代码创建一个指向您要写入的文件的流,循环遍历键值对并逐一将它们写入文件。如果成功完成或捕获了IO异常,则应关闭该流;否则,该进程可能仍然打开了该文件。


1
如果抛出异常,您将永远无法关闭流,导致文件被锁定。 - Eric J.
好的,即使在抛出异常的情况下,文件句柄最终也会被释放。这将取决于垃圾回收器何时运行或程序何时退出(以先到者为准)。这可能在5秒内完成,但也可能在5个月内完成... - user2819245
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - NathanOliver
您说得对。我并不是想在这里编写生产就绪的代码,但您说得非常正确。 - Omar Zaarour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接