我正在用 C# 撰寫一個簡單的程式來添加、洗掉、更改和查看鍵值對。我想將這段代碼中使用的字典保存在一個檔案中。我想在啟動程式時從檔案中加載這個字典,并在退出時保存編輯過的字典。
我已經撰寫了從文本檔案寫入字典的代碼,以及在退出時將字典寫入文本檔案的代碼。每當我使用空文本檔案運行程式時,它都會正常執行并將任何新條目添加到字典中。退出并將這些新字典鍵值保存到文本檔案后,當我再次嘗試加載程式時,似乎鍵對已經在字典中并且不會運行該程式。
我的字典里面也沒有什么可以開始的。
將新字典保存到文本檔案中的代碼是
private void btnExit_Click(object sender, EventArgs e)
{
File.WriteAllLines("myfile.txt",
names.Select(x => "[" x.Key "," x.Value "]").ToArray());
this.Close();
}
這將使文本檔案中的輸出以這種格式
[[email protected],杰克] [[email protected],阿什利] [[email protected],山姆]
將更新的文本檔案輸出到字典的代碼是
private void Form1_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader("myfile.txt");
string line;
while ((line = sr.ReadLine()) != null)
{
string[] arr = line.Split(',');
int i = 0;
while (i < arr.Length)
{
names.Add(arr[i], arr[i 1]);
i = 2;
}
}
}
uj5u.com熱心網友回復:
代替
names.Add(arr[i], arr[i 1]);
你可以
names[arr[i]] = arr[i 1];
第二種方法只是用新值覆寫字典中的任何現有條目,而不是在 Key 存在時崩潰。您還可以選擇使用 TryAdd,它不會崩潰,并且如果密鑰存在則不會添加。您可以使用 bool 回傳值來確定是否添加了鍵/值,如果沒有,您可以呼叫一些更復雜的邏輯,例如將現有專案與您想要添加的專案合并
關于您的問題,我無法解決的一件事是,您的寫入代碼用方括號括住了值,但讀取代碼對它們沒有任何作用,并且您發布的示例檔案不包含它們。
順便說一句,還有一個 File.ReadAllLines,它類似于 File.WriteAllLines,但方向相反;從檔案生成一個陣列。如果您不喜歡 CSV,那么序列化為 json 可能會簡單得多 - 最流行的 json 序列化程式有幫助頁面,顯示了如何在字典和 json 字串之間進行轉換,您可以一次性寫入檔案(File.WriteAllText) - 這里的幫助頁面:https ://www.newtonsoft.com/json/help/html/serializedictionary.htm - 我會鏈接到一個 SO 問題,但規范的問題往往在主題上有很多變化(包括像 JavaScriptSerializer 這樣的古老的東西)——它基本上相當于一行代碼,加上另一行用于撰寫:
var str = JsonConvert.SerializeObject(yourDictionary);
File.WriteAllText(path, str);
讀回它會是這樣的:
var dict = JsonConvert.DeserializeObject<Dictionary<string,string>>(File.ReadAllText(path));
這是一個非常好的輪子,它已經被發明并解決了您最終可能面臨的許多問題,例如包含逗號的鍵或值等
uj5u.com熱心網友回復:
如果鍵中有逗號,這仍然會給您帶來問題,但比原始要少得多:
private void btnExit_Click(object sender, EventArgs e)
{
File.WriteAllLines("myfile.txt",
names.Select(x => $"{x.Key},{x.Value}"));
this.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
var lines = File.ReadLines("myfile.txt");
foreach(var line in lines)
{
string[] arr = line.Split(',');
names.Add(arr[0], String.Join(",", arr.Skip(1)));
}
}
最好包含一個真正的 CSV 撰寫器/決議器并使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/334137.html
上一篇:為什么WordPress后端樣式在我的本地開發環境中不起作用?
下一篇:如何通過更改名稱覆寫檔案?
