Bug:如果文件被删除,列表会保留在内存中,如果文件被删除,列表会保存两次数据
本文关键字:列表 删除 如果 文件 数据 两次 保留 Bug 内存 保存 | 更新日期: 2023-09-27 18:04:21
在我的代码中有一个奇怪的错误,我不明白为什么它的行为方式是这样的。我不是最有经验的代码战士,所以希望有经验的人能明白为什么。
我将对象列表保存到XML文件中。我将对象列表传递给我的函数进行保存,并且我已经编写了代码来检查对象是否已经存在,并且只有在对象不存在时才将其保存到XML文件中。如果我按一次Save按钮,它就会创建文件,并按预期保存。如果我再次按下save,它仍然像预期的那样工作,只保存新对象。
我有这个bug…
如果我按下保存按钮,比如说,3次然后删除文件,当我按下保存并重新创建文件时,列表被保存3次。就好像之前的列表仍然在浮动,只是在彼此的顶部添加。
这是我的代码保存…如果有帮助的话,我的代码HasElement()是XElement的扩展方法,并且简单地返回一个FirstOrDefault()。
public void SaveDB(List<ContactList> cl)
{
if (cl != null)
{
if (!File.Exists(DBPath))
{
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("Contacts")
);
doc.Save(DBPath);
MessageBox.Show("File Created: " + DBPath);
}
MessageBox.Show(DBPath + " already exists!");
XDocument Doc = XDocument.Load(DBPath);
List<XElement> elmAdd = new List<XElement>();
XElement root = Doc.Element("Contacts");
foreach (ContactList CL in cl)
{
if (root.HasElement(CL.Name) == null)
{
if (CL.Selected == true)
{
XElement eName = new XElement(CL.Name, "true");
elmAdd.Add(eName);
}
else if (CL.Selected == false)
{
XElement eName = new XElement(CL.Name, "false");
elmAdd.Add(eName);
}
}
}
MessageBox.Show("Lists saved");
Doc.Element("Contacts").Add(elmAdd);
Doc.Save(DBPath);
} // End if null
else
{
MessageBox.Show("Debug: List is empty");
}
} // end method
很可能这个bug超出了这个函数的作用域,并且以某种方式传递了具有重复条目的List。您可以在函数中处理这种情况,方法是使用Distinct进行分组或更改代码以逐个附加子元素。但更合适的解决方案是确定如何将重复项添加到源列表中。
我检查了代码,在我看来,调用部分有问题。现在,当我点击保存,并将contact
, contact1
, contact2
修改为其他东西,然后再次点击,旧的接触值与新接触值一起保存。没关系。当我删除文件并单击save时,只会写入新值。触点的和中少了'a'将不会被记忆。
private ContactList MyContact { get; set; } // MyContact is initialized with name contact
void Clickery(object o, RoutedEventArgs e)
{
MyContact = new ContactList
{
Name = MyContact.Name + "a",
Selected = false
};
}
void Clicky(object o, RoutedEventArgs e)
{
string DBPath = "somefile.txt";
List<ContactList> cl = new List<ContactList>() {
MyContact,
new ContactList { Name = "contact1", Selected = false },
new ContactList { Name = "contact2", Selected = true } };
if (cl != null)
{
if (!File.Exists(DBPath))
{
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("Contacts")
);
doc.Save(DBPath);
MessageBox.Show("File Created: " + DBPath);
} else {
MessageBox.Show(DBPath + " already exists!");
}
XDocument Doc = XDocument.Load(DBPath);
List<XElement> elmAdd = new List<XElement>();
XElement root = Doc.Element("Contacts");
foreach (ContactList CL in cl)
{
if (root.Element(CL.Name) == null)
{
if (CL.Selected == true) {
XElement eName = new XElement(CL.Name, "true");
elmAdd.Add(eName);
} else {
XElement eName = new XElement(CL.Name, "false");
elmAdd.Add(eName);
}
}
}
MessageBox.Show("Lists saved");
Doc.Element("Contacts").Add(elmAdd);
Doc.Save(DBPath);
} else { // End if null
MessageBox.Show("Debug: List is empty");
}
} // end method
class ContactList
{
public string Name { get; set; }
public bool Selected { get; set; }
}