получил нечетную ошибку в моем коде, и я не понимаю, почему она ведет себя так, как она есть. Я не самый опытный воитель кода, поэтому надеюсь, что кто-то с немного большим опытом сможет понять, почему.Ошибка: список остается в памяти, если файл удален, и сохраняет данные дважды, если файл удален.
Я сохраняю список объектов в файле XML. Я передаю список объектов моей функции для сохранения, и у меня есть код, чтобы проверить, существует ли объект и только сохранить объект в XML-файле, если он не существует. Если я один раз нажимаю кнопку «Сохранить», он создает файл в порядке и сохраняет как ожидалось. Если я снова нажимаю кнопку «Сохранить», она снова работает так, как ожидалось, и сохраняются только новые объекты.
Исправлена ошибка, у меня есть это ...
Если я нажимаю кнопку сохранить, скажем, в 3 раза, а затем удалить файл, когда я нажимаю сохранить и восстановить файл список сохраняется в 3 раза. Как будто предыдущие списки все еще плавают и просто добавляются друг к другу.
Вот мой код для сохранения ... В случае, если это помогает, мой код HasElement() является методом расширения для XElement и просто возвращает FirstOrDefault(). Сохранение происходит только тогда, когда оно возвращается как null.
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
OT: Использовать метод расширения "HasElement()" возвращать булевое значение. Гораздо понятнее: «Q: У вас есть элемент? A: null». –
Самый простой способ работать над тем, что происходит, - это вставить некоторые точки прорыва и пройти через него. Нет ничего очевидного, я предполагаю, что у 'cl' будет больше предметов, чем вы думаете. –