2017-05-15 5 views
0

Für meine Klassenaufgabe muss ich eine alte Liste von Schülern mit einer neuen Liste vergleichen und die neuen Schüler hinzufügen, entfernte Schüler und Schüler in separate Listen ändern Ich benutze verschachtelte foreach-Schleifen und nicht LINQ, aber mein Problem besteht darin, dass man aus den Schleifen ausbricht, sobald die alte Schülerliste mit einem Eintrag in den neuen Schülern übereinstimmt und zum nächsten Schüler in der alten Liste übergeht.C# - Vergleich zweier Listen von Objekten für Änderungen mit foreach

Mein Code läuft jetzt durch den verschachtelten foreach, vergleicht die Einträge mit dem ersten Eintrag in der alten Liste und kommt als Ergebnis ohne ID-Übereinstimmungen daher in die entfernte Liste und beendet die Schleifen, ohne weiterzugehen der nächste Schüler in der alten Liste.

public static void CompareStudents(List<Student> oldList, List<Student> newList) 
    { 
     foreach (Student o in oldList) 
     { 
      foreach (Student n in newList) 
      { 
       if (FindStudent(o.ID, n.ID)) 
       { 
        if (CheckChanges(o, n)) 
        { 
         changed.Add(n); 
         break; 
        } 
       } 
       else 
       { 
        removed.Add(o); 
        break; 
       } 
      } 
     } 
    } 

    private static bool FindStudent(string oldID, string newID) 
    { 
     if (newID.Equals(oldID)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public static bool CheckChanges(Student oldStu, Student newStu) 
    { 
     if (oldStu.FirstName.Equals(newStu.FirstName) && 
      oldStu.LastName.Equals(newStu.LastName) && 
      oldStu.StudentYear.Equals(newStu.StudentYear) && 
      oldStu.StudentRank.Equals(newStu.StudentRank)) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 
+0

Ahhh, was ist Ihre Frage? Willst du nur, dass wir deine Hausaufgaben für dich erledigen? –

+0

http://stackoverflow.com/questions/5636438/difference-between-two-lists – Fredrik

+0

Wo wird die entfernte Liste deklariert? Ihre Anforderungen sind nicht klar. – CRice

Antwort

0

Wenn Ihr Student Klasse die Equals Methode überschreibt, dann können Sie folgendes tun:

public static void CompareStudents(List<Student> oldList, List<Student> newList) 
{ 
    List<Student> added = new List<Student>(); 
    List<Student> removed = new List<Student>(); 
    List<Student> changed = new List<Student>(); 

    foreach(Student n in newList){ 
     // the added list is a subset of the newList so we begin by cloning the newList 
     added.Add(n); 
    } 

    foreach (Student o in oldList) 
    { 
     bool existsInNewList = false; 
     // we remove every o from the added list 
     added.Remove(o); 

     foreach (Student n in newList) 
     { 
      if (o.ID.Equals(n.ID)) 
      { 
       // o and n have the same Id 
       existsInNewList = true; 
       if (!o.Equals(n)) 
       { 
        // o and n have the same Id but are different 
        changed.Add(n); 
        added.Remove(n); 
       } 
       // eventually add a break; here so you don't loop after you've found a n that matches o 
      } 
     } 
     if(!existsInNewList){ 
      // none of the newStudents have the same Id as o 
      removed.Add(o); 
     } 
    } 
} 

Am Ende sollten Sie haben alle drei Listen added, removed und changed mit korrekten Students gefüllt.

+0

Danke, das funktioniert. Ich musste nur die CheckChanges-Methode implementieren. Mein Lehrer stellte uns die verschachtelte foreach als einen Vorschlag zur Verfügung, damit ich in dieser Linie des Denkens stecken blieb. –

+0

Gern geschehen :) – Rafalon

-1

Ich denke, Sie sollten den Code wie unter verwenden:

List<Student> OldStudents = new List<Student>(); 
List<Student> NewStudents = new List<Student>(); 
List<Student> StudentsEdit = new List<Student>(); 

foreach (var oStud in OldStudents) 
    { 
     foreach (var nStud in NewStudents) 
     { 
      if (oStud != nStud) 
      StudentsEdit.Add(oStud); 
     } 
    } 

I Ausgelegt LINQ von Instructor vorgeschlagen wurde, mein schlecht, hoffe, das hilft.

Grüße,

N Baua

+0

* ... Der Kursleiter spezifiziert mit geschachtelten foreach Schleifen und nicht LINQ ... * – Sinatr

+0

auch das macht keinen Unterschied zwischen hinzugefügten, entfernten und geänderten Elementen, und Sie ** sogar ** Schüler hinzugefügt **, wie Sie Ergebniswerte aus der alte Studentenliste (so auch das OP) – Rafalon

+0

Woah! Ihre Bearbeitung ist noch schlimmer, da Ihre StudentsEdit-Liste viel zu viele Schüler enthält (denken Sie an jeden Schüler in der alten Liste, fast jeder Schüler der neuen Liste unterscheidet sich davon, also fügen Sie ihn Ihrer Editierliste hinzu) – Rafalon

0

Wie wäre es ein Flag mit?

 foreach (Student o in oldList) 
     { 
      bool flag = false; 
      foreach (Student n in newList) 
      { 
       if (FindStudent(o.ID, n.ID)) 
       { 
        if (CheckChanges(o, n)) 
        { 
         changed.Add(n); 
         flag = true; 
         break; 
        } 
       } 
       else 
       { 
        removed.Add(o); 
        flag = true; 
        break; 
       } 
      } 
      if(flag) continue; 
     } 
Verwandte Themen