gpt4 book ai didi

c# - 如何在txt的新行中添加每个字典的值?

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:08 25 4
gpt4 key购买 nike

我正在查阅一个信息并将其保存在一个字典中(我有大约 1000 个字典)并且我希望每个字典的值都存储在一行中,

但我的代码目前每次读取新字典时都会覆盖。我怎样才能做到每一行都有每个字典的值?

        Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary = objeto.diccionary;
string valueDic = "";


string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"myfile.txt");


if (!File.Exists(path))
{
File.Create(path).Dispose();

using (StreamWriter file = new StreamWriter(path))
{
foreach (var entry in dictionary)
{

valueDic = valueDic + "|" + entry.Value.ToString();

}
file.WriteLine(valueDic);
}

}
else if (File.Exists(path))
{
using (StreamWriter file = new StreamWriter("myfile.txt"))
{
foreach (var entry in dictionary)
{
// //file.WriteLine("[{0} {1}]", entry.Key, entry.Value);
valueDic = valueDic + "|" + entry.Value.ToString();

}

}
}

最佳答案

您的代码存在一些问题,您真的不需要像在文件不存在时那样创建文件,有一些更简单的方法可以解决这个问题。

首先,您真的不必手动创建文件,这通常由框架提供给您的方法处理,或者通过指定 FileMode ,如 OpenOrCreateCreateAppend

另一件需要注意的事情是,您执行了两次相同的操作,一次是在创建文件时,一次是在您尝试附加到文件时。这有点容易出错,如果您稍后更改格式,您可能会忘记这两种方法,然后创建或追加创建不同的字符串。

我写了一些示例,您可以通过其他方式进行操作。

例如,您可以考虑使用 FileMode.Append

创建文件流本身的选项
static void WriteDictionaryToFile<TKey, TValue>( IDictionary<TKey, TValue> dict, string filename )
{
using (var fs = new StreamWriter( new FileStream(filename, FileMode.Append, FileAccess.Write ) ) )
{
foreach (var kvp in dict)
{
fs.WriteLine(string.Format("{0}|{1}", kvp.Key, kvp.Value));
}
}
}

但是,创建用于向其附加文本的 StreamWriter 并不是真正的必要,C# 3.5 已经为您提供了以下选项,使用 File.AppendText 而不是

static void WriteDictionaryToFileEasy<TKey, TValue>( IDictionary<TKey, TValue> dict, string filename)
{
using (var fs = File.AppendText( filename ))
{
foreach (var kvp in dict)
{
fs.WriteLine(string.Format("{0}|{1}", kvp.Key, kvp.Value));
}
}
}

或者如果您觉得使用 Linq 足够安全,您可以改用 File.AppendAllText 方法,尽管这可能感觉有点尴尬,因为我们只有在字典出现时才需要添加最后的换行符不为空(这是在缺少 File.AppendAllLines 方法的情况下,它会为您处理)

static void WriteDictionaryToFileLinq<TKey, TValue>( IDictionary<TKey, TValue> dict, string filename)
{
if ( dict == null || dict.Count == 0)
{
return;
}
File.AppendAllText(
filename,
string.Join(
Environment.NewLine,
dict.Select( kvp => string.Format("{0}|{1}", kvp.Key, kvp.Value) )
.Concat( new[] { string.Empty } ).ToArray()
)
);
}

(我在这里添加换行符纯粹是为了便于阅读)

如果你把它们放在一起,你可以像这样使用这个程序:

static void Main(string[] args)
{
var dict = new Dictionary<string, string>()
{
{ "key1", "value1" }
};

string targetFile = Path.Combine(Environment.CurrentDirectory, "temp.txt");
if (File.Exists( targetFile))
{
File.Delete(targetFile);
}
WriteDictionaryToFile(dict, targetFile);
WriteDictionaryToFileEasy(dict, targetFile);
WriteDictionaryToFileLinq(dict, targetFile);

var lines = File.ReadAllLines(targetFile);
Debug.Assert(lines.Length == 3, "Expected exactly 3 lines");
Debug.Assert(string.Equals(lines[0], "key1|value1"), "First line should equal 'key1|value1'");
}

最后一个考虑点是您希望如何处理您存储的最终数据。我想在某个时候,您会希望将文件中的数据检索到某些词典中。

这可能会产生一些错误,比如键或值包含 | 字符,或者很可能保存了多个相同命名的键,请注意这一点,因为问题没有处理您将如何存储这些数据,我将警告该部分打开

关于c# - 如何在txt的新行中添加每个字典的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com