C# 如何找出两个列表中的差异?

C# 如何找出两个列表中的差异?,c#,.net,C#,.net,正如您在下面看到的,我需要有一个输出,用于显示添加的学生,更改的学生,以及删除的学生。我想我已经研究了如何准确地完成这项工作,并一直在RemovedStudents()中找到我当前设置的内容。有没有人有任何例子可以帮助我完成添加、更改和删除的学生方法?我将非常感谢在这方面的任何帮助 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnosti

正如您在下面看到的,我需要有一个输出,用于显示添加的学生更改的学生,以及删除的学生。我想我已经研究了如何准确地完成这项工作,并一直在
RemovedStudents()
中找到我当前设置的内容。有没有人有任何例子可以帮助我完成添加、更改和删除的学生方法?我将非常感谢在这方面的任何帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace OldandNewStudents
{
    class Program
    {
        static void Main(string[] args)
        {
            //Display lists of students
            Console.WriteLine("Here is the list of old students: ");
            ShowStudents(GetStudentsOld());
            Console.WriteLine("Here is the list of new students: ");
            ShowStudents(GetStudentsNew());

            //Show the additions
            Console.WriteLine("Here is the list Additions: ");

            //Show the changes
            Console.WriteLine("Here is the list of Changes: ");

            //Show the removed students
            Console.WriteLine("Here is the list of removed students: ");
            RemovedStudents(GetStudentsNew(), GetStudentsOld());
            Console.ReadLine();
        }

        public static List<Student> GetStudentsOld()
        {
            List<Student> students = new List<Student>();

            students.Add(new Student("111", "Michael", "Tucker", "Junior", 10));
            students.Add(new Student("222", "Svetlana", "Omelchenko", "Senior", 2));
            students.Add(new Student("333", "Michiko", "Osada", "Senior", 7));
            students.Add(new Student("444", "Hugo", "Garcia", "Junior", 16));
            students.Add(new Student("555", "Cesar", "Garcia", "Freshman", 4));
            students.Add(new Student("666", "Fadi", "Fakhouri", "Senior", 72));
            students.Add(new Student("777", "Hanying", "Feng", "Senior", 11));
            students.Add(new Student("888", "Debra", "Garcia", "Junior", 41));
            students.Add(new Student("999", "Terry", "Adams", "Senior", 6));
            students.Add(new Student("211", "Bob", "Stephenson", "Junior", 150));
            return students;
        }

        public static List<Student> GetStudentsNew()
        {
           List<Student> students = new List<Student>();

            students.Add(new Student("111", "Michael", "Tucker", "Junior", 10));
            students.Add(new Student("222", "Svetlana", "Omelchenko", "Senior", 2));
            students.Add(new Student("333", "Michiko", "Osada", "Senior", 7));
            students.Add(new Student("311", "Sven", "Mortensen", "Freshman", 53));
            students.Add(new Student("444", "Hugo", "Garcia", "Freshman", 16));
            students.Add(new Student("555", "Cesar", "Garcia", "Freshman", 4));
            students.Add(new Student("666", "Fadi", "Fakhouri", "Senior", 72));
            students.Add(new Student("777", "Hanying", "Feng", "Senior", 11));
            students.Add(new Student("888", "Debra", "Garcia", "Junior", 41));
            students.Add(new Student("411", "Lance", "Tucker", "Junior", 60));
            students.Add(new Student("999", "Terry", "Adams", "Senior", 6));
            return students;
        }

        public static void ShowStudents(List<Student> stuList)
        {
            Console.WriteLine();

            foreach (Student s in stuList)
            {
                Console.WriteLine(s);
            }
            Console.WriteLine();
        }

        public static void RemovedStudents(List<Student> stuNewList, List<Student> stuOldList)
        {
            List<Student> removedStudents = stuNewList.Except(stuOldList).ToList();
            IEnumerable<Student> differenceQuery = stuNewList.Except(stuOldList);
            foreach (Student s in differenceQuery)
                Console.WriteLine(s);
        }
    }
}
这是我的新添加方法,但我不确定为什么会出现过载错误:

public static List<Student> GetActualNewStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        List<Student> actualNewStudents = new List<Student>();

        foreach (var student in oldStudents) {
            if (oldStudents[student].ID != newStudents[student].ID)
            {
                actualNewStudents.Add(newStudents[student]);
            }
        }

        return actualNewStudents;
    }
public static List getactualnewstudent(列出旧学生,列出新学生)
{
List actualNewStudents=新列表();
foreach(旧学生中的var学生){
if(旧学生[student].ID!=新学生[student].ID)
{
实际newStudents.Add(newStudents[student]);
}
}
返回实际新闻;
}

你可以做的是和普通学生一起创建一个第三个数组,然后对于所有不存在的学生,在新的学生数组中考虑一个新的学生,当然:

编辑:

public static List getactualnewstudent(列出旧学生,列出新学生)
{
var actualNewStudents=新列表();
foreach(newStudents中的var项)
{
如果(!oldStudents.Contains(项))
实际新闻。添加(项目);
}
返回实际新闻;
}

使用这两个列表的问题在于比较,例如Except扩展方法将使用IEquatable的默认实现。您有一个构造函数,但不包括类定义。如果字段和属性仅包含值类型,则应用逐字节比较。如果有任何引用类型,则需要重写默认的Equals方法。如果您只有值类型字段,那么下面的代码应该可以工作

补充:

GetStudentsNew().Except(GetStudentsOld());
删除:

GetStudentsOld.Except(GetStudentsNew());
区别:

public diff(IEnumerable<Student> new, IEnumberable<Student> old)
{
    var both = new.AddRange(old); 
    var add = both.Except(new);
    return add.Except(old);
}
public diff(IEnumerable new,IEnumerable old)
{
var两者=new.AddRange(旧的);
var add=两者。除(新的)外;
返回add.Except(旧);
}

我应该注意到,Console.WriteLine不会像您期望的那样工作,因为您正在传递一个引用类型,而不是一个将转换为您期望的字符串的类型

这起到了作用,并得到了我需要的结果:

添加代码:

public static List<Student> GetActualNewStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        //Show the new students
        List<Student> actualNewStudents = newStudents.Where(y => !oldStudents.Any(z => z.ID == y.ID)).ToList();

        return actualNewStudents;
    }
public static List getactualnewstudent(列出旧学生,列出新学生)
{
//向新生展示
列出实际newStudents=newStudents.Where(y=>!oldstuents.Any(z=>z.ID==y.ID)).ToList();
返回实际新闻;
}
被开除学生的代码:

public static List<Student> GetActualRemovedStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        //Show the removed students
        List<Student> actualRemovedStudents = oldStudents.Where(y => !newStudents.Any(z => z.ID == y.ID)).ToList();

        return actualRemovedStudents;
    }
公共静态列表GetActualRemovedStudents(列出旧学生,列出新学生)
{
//显示被移除的学生
列出actualRemovedStudents=oldStudents.Where(y=>!newStudents.Any(z=>z.ID==y.ID)).ToList();
返回实际退学的学生;
}
更改代码:

public static List<Student> GetActualChangedStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        //Show the changes
        List<Student> actualChangedStudents = newStudents.Where(y => !oldStudents.Any(z => z.FirstName == y.FirstName && z.LastName == y.LastName && z.StudentRank == y.StudentRank && z.StudentYear == y.StudentYear)).ToList();

        return actualChangedStudents;
    }
公共静态列表GetActualChangedStudents(列出旧学生,列出新学生)
{
//显示更改
列出实际更改的学生=新学生。其中(y=>!oldstudens.Any(z=>z.FirstName==y.FirstName&&z.LastName==y.LastName&&z.StudentRank==y.StudentRank&&z.StudentYear==y.StudentYear)).ToList();
返回实际变化的学生;
}

添加与删除完全相反。仅当学生同时存在于两个集合中时,更改才是更改。至少,您应该能够使用实现AddedStudents方法this@Rob是的,我知道。但是我不太确定如何更改添加的方法。那么请尝试一下。它实际上是交换一些变量名。我们不是来帮你做作业的。告诉我们你在哪里陷入困境,我们会帮你解决,但如果你只是把作业粘贴给我们,告诉我们老师要求什么,我们就不会这么做。@Rob显然刚刚告诉你我在哪里陷入困境,但你还没有帮我,哈哈。这只是作业的一小部分。除了这个,我什么都想好了。这就是我请求帮助的原因。我尝试了删除方法,但没有达到我预期的效果,这就是我发帖的原因。对不起,我实际上误读了这个问题。我认为你的
AddedStudents
方法是有效的,而你只是要求
RemovedStudents
逻辑。您的
RemovedStudents
逻辑看起来不错。如果它不起作用,您必须查看
Student
的代码,并覆盖
Equals
GetHashCode()
。我是否只做
ShowStudents(GetStudentsNew()。除了(getstudentsell())
打印结果?不,这需要通过String.Format打印值类型属性。例如Console.WriteLine(“学生:{0}{1}”、s.FirstName、s.LastName);您能确认RemoveStudents方法正确吗
GetStudentsNew()。除了(GetStudentSell());
foreach(student s在stuNewList中)
Console.WriteLine(“学生:{0}{1}”,s.FirstName,s.LastName);
运行它并进行比较?我现在不在电脑前,但它看起来像是只显示新列表。不显示从旧列表中删除的人。唯一应该显示的人是Bob(在旧列表的底部)这听起来是正确的,但它只是给了我一个完整的新闻学生列表。这对我来说毫无意义。你的代码应该可以工作……你认为我需要一个
Contains()
方法来定义我需要检查的内容吗?你到底是如何实现它的?你是否可能忘记了“!”在条件中?用你的新类编辑你的帖子,这样我就可以检查它了。(我忘了在末尾键入返回值)我已经更新了上面的add方法。如果我能正确处理错误,我相信这应该会起作用。有什么想法吗?O(n^2)方法
public static List<Student> GetActualNewStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        //Show the new students
        List<Student> actualNewStudents = newStudents.Where(y => !oldStudents.Any(z => z.ID == y.ID)).ToList();

        return actualNewStudents;
    }
public static List<Student> GetActualRemovedStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        //Show the removed students
        List<Student> actualRemovedStudents = oldStudents.Where(y => !newStudents.Any(z => z.ID == y.ID)).ToList();

        return actualRemovedStudents;
    }
public static List<Student> GetActualChangedStudents(List<Student> oldStudents, List<Student> newStudents)
    {
        //Show the changes
        List<Student> actualChangedStudents = newStudents.Where(y => !oldStudents.Any(z => z.FirstName == y.FirstName && z.LastName == y.LastName && z.StudentRank == y.StudentRank && z.StudentYear == y.StudentYear)).ToList();

        return actualChangedStudents;
    }