2016-12-14 5 views
0

Ich habe eine Sammlung in C#, die Daten von Personen speichert. Jetzt möchte ich die Sammelliste aktualisieren. Bevor ich ein Objekt in der Liste aktualisiere, möchte ich prüfen, ob die Person bereits existiert. Alle Personen haben 9 Eigenschaften. Ich möchte nach zwei Eigenschaften suchen, wenn die gespeicherten Daten bereits in der Sammlung sind.Zur Sammlung hinzufügen, wenn nicht bereits mit linq verfügbar

Wenn die Person bereits existiert, möchte ich die alten Daten löschen und alle Eigenschaften von der neuen speichern.
Wenn die Person nicht existiert, möchte ich ein neues Objekt mit den neuen Daten erstellen.
Neue Daten Ich lese aus einer externen Datei und speichern sie in der Sammelliste.
Alte Daten werden in einer XML-Datei gespeichert und ich lade sie in die Sammelliste.

Mein Ansatz bisher:

neue Person Zur Liste hinzufügen, seine selbst zur Verfügung. Löschen Sie dann Duplikate und halten Sie Personen an, die später zur Liste hinzugefügt werden.

oder

vor mit Linq von person.name und person.sname und stellen Sie alle Eigenschaften, die durch die neuen Daten wählen Sie Hinzufügen, wenn nicht neue existiert erstellen.

List<person> with {name, sname, mobile, email, adress1, adress2, fone, age, gender} 

List<person> list = new List<person>; 
Person person = new Person(); 
XDocument doc = XDocument.Load(XMLPath); 

// somethink like that 
list.Select(list.Name && list.sName) 
where ... 

Ich bin neu mit linq, also hatte ich Probleme, es zu realisieren.

Antwort

1

Nun, die Lösung hängt von vielen Dingen ab, die Sie nicht spezifizieren. Ist Person veränderbar? Wenn ja, ist die Lösung ziemlich einfach:

List<Person> persons = .... 
var specificPerson = perons.Where(p => p.Name == something && p.Age == somethingElse).FirstOrDefault(); 

if (specificPerson != null) //We have a person in the list (I'm assuming Person is a class, not struct) 
{ 
    specificPerson.Name = updatedValue; 
    specificPerson.Age = someOtherUpdatedValue;ç 
    // etc. 
} 
else //Person is not in the list 
{ 
    var newPerson = new Person(/*new data*/); 
    persons.Add(newPerson); 
} 

Wenn Person unveränderlich ist, dann wollen Sie vollständig die vorhandene Person entfernen und eine neue erstellen:

List<Person> persons = .... 
var specificPerson ? Perons.Where(p => p.Name == something && p.Age == somethingElse).FirstOrDefault(); 

if (specificPerson != null) 
{ 
    persons.Remove(specificPerson); 
} 

var newPerson = new Person(/*new data*/); 
persons.Add(newPerson); 
+0

Das war es, vielen Dank! Ich benutzte eine foreach, um die erste Liste zu durchlaufen und die Eigenschaften zu vergleichen. – swtch3k

+0

Wie kann ich Name und Sname vergleichen, wenn beide Zeichenfolge sind. Ich probierte Equals und enthält beide mit einer Ausnahme? (NullReferenceException) – swtch3k

+0

erhalten Sie es mit Hinzufügen Versuch fangen – swtch3k

1

die name und sname alle diejenigen, die wählen Grundsätzlich

list.AsEnumerable().Select(person => ((person.name.Equals(toAdd.name) && person.sName.Equals(toAdd.sName))) ? toAdd : person); 

arbeiten, die Sie wollen, und ersetzen Sie sie durch toAdd (die Person Sie wollen, hinzufügen). Dies sollte, haben Sie Wenn das ausgewählte Element nicht den Kriterien entspricht, wird es nicht ersetzt.

+0

gefunden hat Vielen Dank für Ihre Annäherung! – swtch3k

+0

@ swtch3k du bist willkommen. – ItamarG3

1

Sie haben Lambda zu verwenden für eine Person Auswahl

Person person = list.FirstOrDefault(p => p.name == "NameToAdd" && p.sname == "SNameToAdd"); 

Sie können auch SingleOrDefault stattdessen verwenden, wenn Sie sicher sind, dass nur ein solches Element in einer Sammlung existieren sollten. FirstOrDefault/SingleOrDefault wird eine Person oder null zurückgeben, wenn es keine passende Übereinstimmung in den Kriterien

+0

Vielen Dank für Ihre Lösung! – swtch3k

Verwandte Themen