C# 用C语言对列表中的独立项进行排序#
我在自学C#,但我还是新手。我想知道如何对列表中的多个对象进行排序。这是我的一小段代码。这里有一个澄清,我想按期中/学生姓名或期末考试成绩排列列表(而不是创建新的),同时显示列表中的所有三个值 有两个班。我试着按学生对项目进行排序,然后是期中成绩,然后是期末成绩。如我的学生成绩课程的toString方法所示。我已经看过委托方法,但是我仍然不知道如何从中实现它 任何关于更简单方法的建议都会有所帮助C# 用C语言对列表中的独立项进行排序#,c#,list,sorting,C#,List,Sorting,我在自学C#,但我还是新手。我想知道如何对列表中的多个对象进行排序。这是我的一小段代码。这里有一个澄清,我想按期中/学生姓名或期末考试成绩排列列表(而不是创建新的),同时显示列表中的所有三个值 有两个班。我试着按学生对项目进行排序,然后是期中成绩,然后是期末成绩。如我的学生成绩课程的toString方法所示。我已经看过委托方法,但是我仍然不知道如何从中实现它 任何关于更简单方法的建议都会有所帮助 public class StudentGrades { public string stu
public class StudentGrades
{
public string studentName;
public int MidtermGrade;
public int finalExamGrade;
public StudentGrades()
{
//initialize variables to 0 or ""
}
//some methods here
public string toString()
{
string result = "student: " + studentName + " midterm grade: " + midterm + ...etc;
return result;
}
}
public partial class Grades : Form1
{
List<StudentGrades> studentList;
//StudentGrades is a separate class with no parameters in the constructor
public Grades(List<StudentGrades> student)
{
this.studentList = student;
// some code
}
private void button3_click(Object sender, EventArgs e)
{
this.studentList.Sort(); //default sorting method for sorting students
}
private void button4_click(//same arguments)
{
//sort midterm grades, but don't know how to do it
}
}
公共班级学生成绩
{
公共字符串studentName;
公共内部中期评级;
公共综合财务等级;
公立学生成绩()
{
//将变量初始化为0或“”
}
//这里有一些方法
公共字符串toString()
{
string result=“学生:“+studentName+”期中成绩:“+midtime+…等;
返回结果;
}
}
公共部分班级成绩:表格一
{
学生名单;
//StudentGrades是一个单独的类,构造函数中没有参数
公开课成绩(学生名单)
{
this.studentList=学生;
//一些代码
}
私有无效按钮3\u单击(对象发送者,事件参数e)
{
this.studentList.Sort();//对学生进行排序的默认排序方法
}
私有void按钮4\u单击(//相同参数)
{
//对期中成绩进行排序,但不知道怎么做
}
}
您可以使用委托
首先比较名字,如果结果意味着相同,那么比较等级。。。依此类推,您可以根据您的条件级联排序结果吗
students.Sort(
delegate(StudentGrade s1, StudentGrade s)
{
int compareResult = s1.studentName.CompareTo(s2.studentName);
if (compareResult == 0)
{
return s1.MidtermGrade.CompareTo(s2.MidtermGrade);
}
return compareResult;
}
);
使用LINQ
students.OrderBy(s=> s.studentName)
.ThenBy(s=> s.MidtermGrade);
您可以使用委托
首先比较名字,如果结果意味着相同,那么比较等级。。。依此类推,您可以根据您的条件级联排序结果吗
students.Sort(
delegate(StudentGrade s1, StudentGrade s)
{
int compareResult = s1.studentName.CompareTo(s2.studentName);
if (compareResult == 0)
{
return s1.MidtermGrade.CompareTo(s2.MidtermGrade);
}
return compareResult;
}
);
使用LINQ
students.OrderBy(s=> s.studentName)
.ThenBy(s=> s.MidtermGrade);
如果排序是针对视图的,那么我建议使用目标集合的
ICollectionView
进行排序。这会更快一些,因为它不会真正移动项目来重新排列集合。相反,它保留原始集合的原样,只对其视图进行排序。这相当于对索引的元集合进行排序<代码>ICollectionView也建议用于筛选和遍历集合
在C#中使用属性以公开数据而不是字段也是最佳做法:
public class StudentGrades
{
public string StudentName { get; set; }
public int MidtermGrade { get; set; }
public int FinalExamGrade { get; set; }
public StudentGrades()
{
//initialize variables to 0 or ""
}
//some methods here
public string toString() => $"student: {this.StudentName} midterm grade: {this.MidtermGrade} ...etc";
}
然后使用ICollectionView进行排序:
private void button3_click(Object sender, EventArgs e)
{
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.studentList);
// If you don't want to combine sort criteria
// then remove all previous ones
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(nameof(StudentGrades.StudentName), ListSortDirection.Ascending));
}
private void button4_click(//same arguments)
{
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.studentList);
// If you don't want to combine sort criteria
// then remove all previous ones
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(nameof(StudentGrades.MidtermGrade), ListSortDirection.Ascending));
}
如果排序是针对视图的,那么我建议使用目标集合的
ICollectionView
进行排序。这会更快一些,因为它不会真正移动项目来重新排列集合。相反,它保留原始集合的原样,只对其视图进行排序。这相当于对索引的元集合进行排序<代码>ICollectionView也建议用于筛选和遍历集合
在C#中使用属性以公开数据而不是字段也是最佳做法:
public class StudentGrades
{
public string StudentName { get; set; }
public int MidtermGrade { get; set; }
public int FinalExamGrade { get; set; }
public StudentGrades()
{
//initialize variables to 0 or ""
}
//some methods here
public string toString() => $"student: {this.StudentName} midterm grade: {this.MidtermGrade} ...etc";
}
然后使用ICollectionView进行排序:
private void button3_click(Object sender, EventArgs e)
{
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.studentList);
// If you don't want to combine sort criteria
// then remove all previous ones
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(nameof(StudentGrades.StudentName), ListSortDirection.Ascending));
}
private void button4_click(//same arguments)
{
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.studentList);
// If you don't want to combine sort criteria
// then remove all previous ones
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription(nameof(StudentGrades.MidtermGrade), ListSortDirection.Ascending));
}
LINQ中的排序依据和排序依据。LINQ中的排序依据和排序依据。我想说的是,你不需要在这里指定(学生等级s1,学生等级s),只要
(s1,s2)=>{…}
就行了。至少是最新的语言版本。第二个将不会对现有列表进行排序。我要说的是,这里不需要委托(StudentGrade s1,StudentGrade s)
,只要(s1,s2)=>{…}
就可以了。至少是最新的语言版本。第二个将不会对现有列表进行排序。使用集合后,如何显示已排序的列表。查看?将原始集合绑定到列表框
。现在,修改集合的视图将自动更改显示的数据。在WPF中,控件不直接使用集合。它们都使用集合的默认视图。这就是为什么控件会反映对视图进行排序或过滤的原因。还可以将集合的视图直接绑定到控件。也可以。使用集合后,用户将如何显示已排序的列表。查看?您将原始集合绑定到列表框
。现在,修改集合的视图将自动更改显示的数据。在WPF中,控件不直接使用集合。它们都使用集合的默认视图。这就是为什么控件会反映对视图进行排序或过滤的原因。还可以将集合的视图直接绑定到控件。这也行。