如何根据另一个数组的值对二维数组进行排序?

时间:2015-06-10 06:19:35

标签: c# arrays sorting multidimensional-array

所以我必须从文本文件中读取一些文本行

  

S5555; 100 70 70 100
  S3333; 50 50 50 50
  S2222; 20 50 40 70
  S1111; 90 80 90 85
  S4444; 70 80 90 50

我应该把文本变成2个数组。一个数组存储学生的ID,另一个数组存储学生的标记(2d数组)
现在我需要按字母顺序对学生ID进行排序。如何根据我对1d数组的排序方式对2d数组进行排序?

2 个答案:

答案 0 :(得分:0)

完全披露:我是C程序员,而不是C#程序员,所以这可能不是标准的C#方法。无论如何,它会起作用,它是可读的,而且它是有道理的。这是我在c ++或java中会做的事情,所以我敢打赌它会延续到c#。

我要从我的老派C背景中取一页,并说我认为struct的概念在这里可能会有所帮助。

如果你正在编程c#,你可能知道一个类是什么,对吧?结构只是一个公共所有内部变量的类。如果我必须阅读一个id为' s的员工列表和一个文件的工资,然后按ID号排序,我会有一个这样的结构:

public struct employee
{
    int idnum;
    int yearly_salary;
    String name;
}

每次我宣布一个新的员工变量时,它都会附带3"字段" (idnumyearly_salaryname)。看看这个例子。它创建了两个名为emp1和emp2的新员工队伍。

employee emp1;
emp1.name = "Lisa Goodwin";
emp1.yearly_salary = 129200;
emp1.idnum = 3911;

employee emp2;
emp2.name = "Sevn Rushbjorn";
emp2.yearly_salary = 39800;
emp2.idnum = 8721;

如果我们想要打印身份号码最低的员工的薪水,我们可以执行以下操作:

if(emp1.idnum < emp2.idnum)
{
    Console.WriteLine("salary = ${0}\n", emp1.yearly_salary);
}
else
{
    Console.WriteLine("salary = ${0}\n", emp2.yearly_salary);
}

最重要的是,当您在数组中交换2名员工时,当然会交换所有相应的值。

employee emps[4];
//...... initialize vars from file or whatever...

swap<employee>(emps[3], emps[2]);

使用这些概念,您可以在排序方法中比较id#,(我假设您自己编写,因为这听起来像是家庭作业),并使用c#的标准交换功能来交换2名员工(或者,在您的情况下是学生)。

简单地调整我的员工&#34;对学生来说,这应该可以正常工作。

答案 1 :(得分:-2)

首先将文件解析为字符串数组,对其进行排序,然后从成绩中分离出来。

"S5555;100 70 70 100"
"S3333;50 50 50 50"
"S2222;20 50 40 70"
"S1111;90 80 90 85"
"S4444;70 80 90 50"

然后执行array.Sort(); 将id和等级分成新数组:

String[] fileData;
fileData.Sort();
String[] ids = new String[arraySize];
Int[][] grades = new Int[][arraySize];
for (int I = i;i<arraySize;i++)
{
       string[] splitLine = fileData[i].Split(';');
       ids[i] = splitLine[0];
       string[] stringGrades = splitLine[1].Split(' ');

       grades[i] = new int[stringGrades.Length];

       for (int j = 0; j < stringGrades.Length; j++)
       {
                grades[i][j] = Convert.ToInt32(stringGrades[j]);
       }

 }