2017-05-15 6 views
0

私のクラスの割り当てには、古いリストのリストと新しいリストを比較し、新しい生徒を追加し、削除された生徒を追加し、別のリストに移動する必要があります。 LINQではなくネストされたforeachループを使用していますが、古い学生リストが新しい学生のエントリと一致し、古いリストの次の学生に移動すると、ループから抜け出しています。C# - foreachを使って2つのオブジェクトのリストを比較する

私のコードはネストされたforeachを実行し、古いリストの最初のエントリとエントリを比較します。その結果、IDが一致することなく結果が出てきますので、削除されたリストに入れてループを終了します古いリストの次の生徒。

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

あなたのご質問は何ですか?あなたの宿題を終わらせたいだけですか? –

+0

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

+0

削除されたリストはどこで宣言されていますか?あなたの要件は明確ではありません。 – CRice

答えて

0

あなたStudentクラスがEqualsメソッドをオーバーライドする場合は、次の操作を行うことができます

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

終わりに、あなたは正しいStudentsで満たされ、すべての3つのリストaddedremovedchangedを持っている必要があります。

+0

ありがとう、これは動作します。私はちょうどCheckChangesメソッドを実装する必要がありました。私のインストラクターは、ネストされたforeachを私たちに提案し、私はその考え方にこだわっていました。 –

+0

あなたは大歓迎です:) – Rafalon

-1

下のように私はあなたのコードを使用してしなければならないと思う:私はLINQを解釈

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

は は、この情報がお役に立てば幸い、インストラクターによって提案された私の悪いました。

よろしく、

N Baua

+0

* ... LINQ ... * – Sinatr

+0

ではなく、ネストされたforeachループを使用して指定されたインストラクターも、追加、削除、変更された項目に違いはなく、古い学生リスト(OPもそうです) – Rafalon

+0

うわー!あなたのStudentsEditリストには、あまりにも多くの学生が含まれているので、あなたの編集はさらに悪くなります(古いリストの各学生について考えると、新しいリストのほとんどすべての学生はそれとは異なりますので、編集リストに追加します) – Rafalon

0

どのようにフラグを使用してはどうですか?

 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; 
     } 
関連する問題