将字典内容保存到文件

本文关键字:存到文件 字典 | 更新日期: 2023-09-27 18:35:03

我正在尝试对列表和计数唯一实例做一些非常具体的事情,然后将其保存在文件中的新行上。

本质上,我有一个包含一组列的列表视图,我想遍历整个列表,并保存每个唯一项目的计数。

例如,这样的列表;

111
222
111
333
333
333

最终将被写入文件:

111:2
222:1
333:3

不需要它按任何特定的顺序排列,只要我有这些值。

到目前为止,我有这个;

string fileName = Application.StartupPath + @"'txn_" + 
    TerminalConfig.CreateSafSig() + ".saf";
Dictionary<string, int> products = new Dictionary<string, int>();
List<string> codes = new List<string>();
foreach (ListViewItem item in BasketList.Items)
{ 
    codes.Add(item.SubItems[3].Text); 
}
String[] items = codes.ToArray();
foreach (String code in items)
{
    if (products.ContainsKey(code) != true)
    { 
        products.Add(code, 1); 
    }
    else 
    { 
        products[code] += 1; 
    }
}
foreach (var entry in products)
{ 
    File.WriteAllText(fileName, string.Format("{0}:{1}",entry.Key,entry.Value)); 
}

但是它保存的文件只给了我最后一行。在上面的示例中,它只会显示333:3

我很确定我写对了,我正在努力寻找我出错的地方。

将字典内容保存到文件

File.WriteAllText写入一个新文件。每次循环访问 for 循环时,您都会覆盖该文件,只提供最后一行。

msdn 页显示

创建一个新文件,将内容写入该文件,然后关闭 该文件。如果目标文件已存在,则会覆盖该文件。

您可以将File.WriteAllText替换为File.AppendAllText

打开一个文件,将指定的字符串追加到该文件中,然后 关闭文件。如果该文件不存在,此方法将创建一个 文件,将指定的字符串写入文件,然后关闭该文件。

如果要一次写入所有文件,可以使用File.WriteAllLines(string path,IEnumerable<string> contents) ;

创建一个新文件,将字符串集合写入该文件,以及 然后关闭文件。

在您的情况下,请替换:

foreach (var entry in products)
{ 
    File.WriteAllText(fileName, string.Format("{0}:{1}",entry.Key,entry.Value)); 
}

var entries = from entry in products select string.Format("{0}:{1}",entry.Key,entry.Value);
File.WriteAllLines(fileName,entries);

问题是每次循环迭代都会覆盖文件。

代码修复:

StringBuilder str = new StringBuilder();

foreach (var entry in products)
{
   str.AppendLine(string.Format("{0}:{1}", entry.Key, entry.Value));
}
File.WriteAllText(fileName, str.ToString()); }

要加入linq的潮流,以下是制作字典的代码:

Dictionary<string, int> products = 
    BasketList.Items.GroupBy(element => element.SubItems[3].Text)
                    .ToDictionary(k => k.Key, c => c.Count())

是的,在 linq 中,它将所有这些行替换为一行。

>哈里森回答了为什么你的代码不起作用......现在让我告诉你为什么琼斯(粗鲁地(建议你使用GroupBy...

File.WriteAllLines(fileName,
               from item in BasketList.Items
               group item by item.SubItems[3].Text into grp
               select string.Format("{0}:{1}", grp.Key, grp.Count()));

这有效地替换了所有代码。它的效率较低 - GroupBy当你实际上只需要计数时创建项目组,所以它在内存使用方面有点重量级 - 但这通常不是一个非常重要的因素。言简意赅是有话要说的。

WriteAllText 函数将使用您提供的字符串覆盖文件内容。 您应该改用 AppendAllText 函数