列表中有多个相同的元素,如何只显示一次,没有重复?

时间:2019-03-23 16:57:28

标签: c#

我的列表包含多个主题,但其中一些主题相同。如何全部显示而不重复显示?

public class Subject
{
    public string SubjectName { get; set; }

    public Subject(string subjectName)
    {
        this.SubjectName = subjectName;
    }
}
List<Subject> listOfSubjects = new List<Subject>();
string subject = "";
Console.WriteLine("Enter the name of the subject");
subject = Console.ReadLine();
listofSubjects.Add(new Subject(subject));
string pastSubject = "";                   
foreach (Subject sub in listOfSubjects)
{
    if (sub.SubjectName != pastSubject)
    {
        Console.WriteLine(sub.SubjectName);
    }
    pastSubject = sub.SubjectName;
}

3 个答案:

答案 0 :(得分:1)

如果使用Linq,则可以使用GroupBy按名称获取不同的Subject

var distinctList = listOfSubjects
                     .GroupBy(s => s.SubjectName)    // group by names
                     .Select(g => g.First());        // take the first group

foreach (var subject in distinctList)
{
    Console.WriteLine(subject.SubjectName);
}

此方法返回IEnumerable<Subject>,即实际Subject类的集合。

我创建了一个fiddle

答案 1 :(得分:1)

一种解决方案是为Subject类构建一个IEqualityComparer<Subject>。下面是它的代码。

public class SubjectComparer : IEqualityComparer<Subject>
{
    public bool Equals(Subject x, Subject y)
    {
        if (x == null && y == null)
        {
            return true;
        }
        else if (x == null || y == null)
        {
            return false;
        }
        else
        {
            return x.SubjectName == y.SubjectName;
        }
    }

    public int GetHashCode(Subject obj)
    {
        return obj.SubjectName.GetHashCode();
    }
}

然后只需调用提供IEqualityComparer实例的System.Linq Distinct函数即可。

List<Subject> distinctSubjects = listOfSubjects.Distinct(new SubjectComparer()).ToList();

生成的distinctSubjects列表为Distinct。

答案 2 :(得分:0)

您可以通过以下方式获得不同的主题名称

var distinctSubjectNames = listOfSubjects
    .Select(s => s.SubjectName)
    .Distinct();
foreach (string subjectName in distinctSubjectNames) {
        Console.WriteLine(subjectName);
}
相关问题