2015-07-24 8 views
0

получил нечетную ошибку в моем коде, и я не понимаю, почему она ведет себя так, как она есть. Я не самый опытный воитель кода, поэтому надеюсь, что кто-то с немного большим опытом сможет понять, почему.Ошибка: список остается в памяти, если файл удален, и сохраняет данные дважды, если файл удален.

Я сохраняю список объектов в файле 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 
+0

OT: Использовать метод расширения "HasElement()" возвращать булевое значение. Гораздо понятнее: «Q: У вас есть элемент? A: null». –

+1

Самый простой способ работать над тем, что происходит, - это вставить некоторые точки прорыва и пройти через него. Нет ничего очевидного, я предполагаю, что у 'cl' будет больше предметов, чем вы думаете. –

ответ

0

Скорее всего, ошибка выходит за рамки этой функции, и каким-то образом List с повторяющимися записями был передан. Вы можете обрабатывать такую ​​ситуацию в своей функции, группируя с помощью Distinct или меняя свой код для добавления дочерних элементов по одному. Но более подходящим решением будет определение того, как дубликаты были добавлены в исходный список.

+0

Это действительно так. Я вернулся к своей форме, где я назвал функцию сохранения. Где я ошибся, я создал временный список объектов для отладки. Эти объекты снова и снова добавлялись в тот же список. Если файл нужно было воссоздать, а сохранение было нажато более одного раза, список содержал несколько версий одних и тех же объектов. Чувство довольно глупо прямо сейчас ... но спасибо за помощь всем. – LeeAttewell

0

Я проверил код, и мне кажется, что что-то не так в части вызова. Теперь, когда я нажимаю «Сохранить» и изменяю contact, contact1, contact2 на что-то другое, а затем снова нажмите, старые значения контактов сохраняются вместе с новыми. Ничего страшного. Когда я удалю файл и нажмите «Сохранить», будут записаны только новые значения. Меньше «а» в контакте и не будет запоминаться в памяти.

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; } 
}