C# 使用foreach循环在可观察集合中查找重复项

C# 使用foreach循环在可观察集合中查找重复项,c#,linq,loops,foreach,lambda,C#,Linq,Loops,Foreach,Lambda,我正在尝试使用Lambda/LINQ查找ObservableCollection中的所有副本 假设我有我的可观察的学生名单 每个学生都有自己的领域 Name Age Class 现在在列表中,假设以下是列表中的输入 studentList.Add(new Student() { Name = Name, Age= Age, Class = Class }); 每次用户输入数据并单击按钮时,都会添加数据。所以在我的清单中,我会举一

我正在尝试使用Lambda/LINQ查找ObservableCollection中的所有副本 假设我有我的可观察的学生名单

每个学生都有自己的领域

Name
Age
Class
现在在列表中,假设以下是列表中的输入

studentList.Add(new Student()
    {
        Name = Name,
        Age= Age,
        Class = Class
    });
每次用户输入数据并单击按钮时,都会添加数据。所以在我的清单中,我会举一个例子

鲍勃,6岁,蓝色班级

杰瑞8号,红色班

安迪7号,红色班

鲍勃,10岁,红色班

我想循环浏览列表,找出哪些名称是重复的 到目前为止,我的代码是:

bool cont = false;
foreach (var dup in studentList)
    {
        if (!studentList.Any(x => x.Name== dup.Name))
            {
                cont = true;
            }
            else
            {
                cont = false;
                break;
            }
    }
但有些事情是不对的。它将始终在if语句中摆动。 如果我输入4个完全不同的名字,它仍然会说false。它接受最后输入的值,并始终将其与该值进行比较,从不实际检查所有值

这有点难以解释。如果我知道问题出在哪里,我会帮上更多的忙

我想要做的就是在我的列表中循环查找匹配的值,并将bool设置为false并中断循环,这样用户就可以得到通知并在继续之前进行更改。我希望解决方案是在Lambda/LINQ语句中

studentList.GroupBy(n => n.Name).Where(n => n.Count() > 1).Select(n => n.Key);
解释:这段代码首先按姓名对他们进行分组,创建一个字典,格式为name=>具有该姓名的学生列表,然后检查有多个姓名的地方并选择该姓名。

根据您的评论,您不需要foreach循环,您可以在一行中完成此操作:

bool control = studentList
               .Any(s => studentList.Count(x => x.Name == s.Name) > 1);
这个怎么样:

bool anyDuplicates = studentList.Select(i => i.Name).Distinct().Count() 
                     < studentList.Count();
这将检查不同的姓名列表是否小于完整的学生列表。

EDIT

您可以简单地使用linq,如下所示:

var duplicateNamesList = studentList.GroupBy(x => x.Name).Where(x => x.Count() > 1).Select(x => x.Key);
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Class { get; set; }

    public class EqualityComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            return x.Name == y.Name;
        }

        public int GetHashCode(Student obj)
        {
            unchecked  // overflow is fine
            {
                int hash = 17;
                hash = hash * 23 + obj.Name.GetHashCode();
                return hash;
            }
        }
    }
}
studentList = studentList.Distinct(new Student.EqualityComparer()).ToList();
您必须为您的学生班级实施IEqualityComparer,如下所示:

var duplicateNamesList = studentList.GroupBy(x => x.Name).Where(x => x.Count() > 1).Select(x => x.Key);
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Class { get; set; }

    public class EqualityComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            return x.Name == y.Name;
        }

        public int GetHashCode(Student obj)
        {
            unchecked  // overflow is fine
            {
                int hash = 17;
                hash = hash * 23 + obj.Name.GetHashCode();
                return hash;
            }
        }
    }
}
studentList = studentList.Distinct(new Student.EqualityComparer()).ToList();

我相信如果你搜索一下,你会找到这个问题的答案。示例如何处理重复的名称?“把这个放在新的列表里?”马可姆已经搜索过了。当然,试图找到与我相似的东西,你可能并不总是能得到。目前仍在检查谷歌的搜索结果,直到有一个好消息answer@LucasAbilidebob不需要。如果有任何重复的名称,只需返回true即可。这就是为什么我有一个bool和一个breakSee OP的最后一条评论:没有。如果有任何重复的名字,只想返回一个true。这就是为什么我有一个布尔和休息