如何在 C# 中按升序对多维数组进行排序? [复制]

Posted

技术标签:

【中文标题】如何在 C# 中按升序对多维数组进行排序? [复制]【英文标题】:How to sort an multidimensional array in ascending order in C#? [duplicate] 【发布时间】:2019-12-02 11:12:47 【问题描述】:

我创建了一个字符串类型的二维数组,其中存储了姓名、3 个科目的分数和总分。我需要根据排名显示记录,即应首先显示总分较高的学生。我如何在 C# 中实现这一点?请帮忙.....

class Program
    
        static void Main(string[] args)
        
            int noOfStudents, totalMarks, position = 1;
            string studentName, engMarks, mathMarks, computerMarks;

            Console.Write("Enter Total Students: ");
            noOfStudents = Convert.ToInt32(Console.ReadLine());
            string[,] studentInfo = new string[noOfStudents, 5];

            studentInformation(studentInfo);

            for(int i = 0; i < studentInfo.GetLength(0) + 1; i++)
            
                int temp, count = 0;
                for(int j = 0; j < studentInfo.GetLength(1); i++)
                
                    if (int.Parse(studentInfo[i,4]) < int.Parse(studentInfo[i+1, 4]))
                    
                        temp = int.Parse(studentInfo[i, 4]);
                        studentInfo[i, 4] = studentInfo[i + 1, 4];
                        studentInfo[i + 1, 4] = temp.ToString();
                    
                    else
                    
                        count++;
                    
                
                    Console.WriteLine("Student Name: 0, Position: 1, Total: 2/300", studentInfo[i,0], position, studentInfo[i, 4]);
                    position++;

            

            Console.ReadKey();
                void studentInformation(string[,] a) 
                for(int i = 0; i < noOfStudents; i++)
                
                    Console.Write("Enter Student Name: ");
                    studentName = Console.ReadLine();
                    studentInfo[i, 0] = studentName;

                    Console.Write("Enter English Marks(Out of 100): ");
                    engMarks = Console.ReadLine();
                    studentInfo[i, 1] = engMarks;

                    Console.Write("Enter Maths Marks(Out of 100): ");
                    mathMarks = Console.ReadLine();
                    studentInfo[i, 2] = mathMarks;

                    Console.Write("Enter Computer Marks(Out of 100): ");
                    computerMarks = Console.ReadLine();
                    studentInfo[i, 3] = computerMarks;

                    Console.WriteLine("************************************");
                    totalMarks = (int.Parse(engMarks) + int.Parse(mathMarks) + int.Parse(computerMarks));
                    studentInfo[i, 4] = totalMarks.ToString();
                 
            
        
    

【问题讨论】:

在尝试上述方式时...它给了我一个索引超出范围的错误 试试这个:***.com/questions/232395/… i &lt; studentInfo.GetLength(0) + 1:为什么是+ 1 您的课程是否已经涵盖“创建/使用类”?因为您应该使用具有适当属性的“学生”类的列表(或者可能是数组)而不是多维字符串数组 另见***.com/questions/20940979/… 【参考方案1】:

这取决于你期望做什么:

如果您的目标是对表格进行排序然后打印出来

一种简单的方法是解析整个学生列表的次数与列表中的学生数量一样多,然后在每次解析时将每个学生与下一个学生进行比较。如果它们的顺序不正确,即成绩较低的学生在列表中较高,则只需交换它们即可。

在这种情况下,这会给你类似的东西:

class Program

    static void Main(string[] args)
    
        int noOfStudents, totalMarks, position = 1;
        string studentName, engMarks, mathMarks, computerMarks;

        Console.Write("Enter Total Students: ");
        noOfStudents = Convert.ToInt32(Console.ReadLine());
        string[,] studentInfo = new string[noOfStudents, 5];

        studentInformation(studentInfo);

        // Sorting
        for (int i = 0; i < noOfStudents; i++)
        
            for (int j = 0; j < (noOfStudents - 1); j++)
            
                if (Int32.Parse(studentInfo[j, 4]) < Int32.Parse(studentInfo[j +1, 4]))
                
                    // Temporary element used to store the sorted data
                    string[,] temp = new string[1, 5];

                    // Exchange every grade + name from the higher one to the lesser one
                    for (int k = 0; k < 5; k++)
                    
                        // Copy one to temp element
                        temp[0, k] = studentInfo[j, k];
                        // Copy the other in the first one
                        studentInfo[j, k] = studentInfo[j + 1, k];
                        // Copy back temp in the other one
                        studentInfo[j + 1, k] = temp[0, k];
                    
                
            
        

        for (int i = 0; i < noOfStudents; i++)
        
            Console.WriteLine("Student Name: 0, Position: 1, Total: 2/300", studentInfo[i, 0], position, studentInfo[i, 4]);
        



        Console.ReadKey();
        void studentInformation(string[,] a)
        
            for (int i = 0; i < noOfStudents; i++)
            
                Console.Write("Enter Student Name: ");
                studentName = Console.ReadLine();
                studentInfo[i, 0] = studentName;

                Console.Write("Enter English Marks(Out of 100): ");
                engMarks = Console.ReadLine();
                studentInfo[i, 1] = engMarks;

                Console.Write("Enter Maths Marks(Out of 100): ");
                mathMarks = Console.ReadLine();
                studentInfo[i, 2] = mathMarks;

                Console.Write("Enter Computer Marks(Out of 100): ");
                computerMarks = Console.ReadLine();
                studentInfo[i, 3] = computerMarks;

                Console.WriteLine("************************************");
                totalMarks = (int.Parse(engMarks) + int.Parse(mathMarks) + int.Parse(computerMarks));
                studentInfo[i, 4] = totalMarks.ToString();
            
        
    

根据您的代码,您遇到了一些问题,让我们专注于它们:

您只交换平均成绩,这将导致学生的平均成绩不属于他们。 您的主循环在这里:for(int i = 0; i

但这真的是个好方法吗

嗯……不。

正如 cmets 中提到的,处理这个问题的更好方法是使用对象。例如,一个对象学生将有一个成绩列表和一个平均成绩。

这样编码会更容易。

【讨论】:

以上是关于如何在 C# 中按升序对多维数组进行排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

多维数组c#数字排序[关闭]

如何在 Reactjs 中按升序或降序对数据进行排序?

二维,多维数组排序array_multisort()函数的使用

php多维数组自定义排序 uasort()

php多维数组自定义排序 uasort()

在 C# 中按名称和日期作为键对字典进行排序? [复制]