Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言对列表中的独立项进行排序#_C#_List_Sorting - Fatal编程技术网

C# 用C语言对列表中的独立项进行排序#

C# 用C语言对列表中的独立项进行排序#,c#,list,sorting,C#,List,Sorting,我在自学C#,但我还是新手。我想知道如何对列表中的多个对象进行排序。这是我的一小段代码。这里有一个澄清,我想按期中/学生姓名或期末考试成绩排列列表(而不是创建新的),同时显示列表中的所有三个值 有两个班。我试着按学生对项目进行排序,然后是期中成绩,然后是期末成绩。如我的学生成绩课程的toString方法所示。我已经看过委托方法,但是我仍然不知道如何从中实现它 任何关于更简单方法的建议都会有所帮助 public class StudentGrades { public string stu

我在自学C#,但我还是新手。我想知道如何对列表中的多个对象进行排序。这是我的一小段代码。这里有一个澄清,我想按期中/学生姓名或期末考试成绩排列列表(而不是创建新的),同时显示列表中的所有三个值

有两个班。我试着按学生对项目进行排序,然后是期中成绩,然后是期末成绩。如我的学生成绩课程的toString方法所示。我已经看过委托方法,但是我仍然不知道如何从中实现它

任何关于更简单方法的建议都会有所帮助

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中,控件不直接使用集合。它们都使用集合的默认视图。这就是为什么控件会反映对视图进行排序或过滤的原因。还可以将集合的视图直接绑定到控件。这也行。