我的列表包含多个主题,但其中一些主题相同。如何全部显示而不重复显示?
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;
}
答案 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);
}