将字典内容保存到文件
本文关键字:存到文件 字典 | 更新日期: 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 函数