C# 为数组编制索引以使用数值放置正确的字符串值
我让它打印排序后的成绩数组,但显示的成绩与错误的名称C# 为数组编制索引以使用数值放置正确的字符串值,c#,C#,我让它打印排序后的成绩数组,但显示的成绩与错误的名称 class Program { static void Main(string[] args) { int namelength; string names; double grade, max, min, testgradeaverage; int nameindex = 0; int gradeindex = 0; Conso
class Program
{
static void Main(string[] args)
{
int namelength;
string names;
double grade, max, min, testgradeaverage;
int nameindex = 0;
int gradeindex = 0;
Console.WriteLine("Please enter the amount of names you wish to enter: ");
namelength = Convert.ToInt32(Console.ReadLine());
string[] name = new string[namelength];
double[] testgrades = new double[namelength];
for (int i = 0; i < testgrades.Length; i++)
{
Console.WriteLine("Please enter the names of each student");
names = Convert.ToString(Console.ReadLine());
name[i] += names;
nameindex = i;
}
for (int i = 0; i < name.Length; i++)
{
Console.WriteLine("Please enter the final grade for " + name[i]);
grade = Convert.ToDouble(Console.ReadLine());
testgrades[i] += grade;
gradeindex = i;
}
max = testgrades.Max();
min = testgrades.Min();
testgradeaverage = testgrades.Average();
Console.WriteLine("The highest grade is: " + max);
Console.WriteLine("The Lowest Grade is:" + min);
Console.WriteLine("The class average is: " + testgradeaverage);
for (int k = 0; k < namelength; k++)
{
sorted(ref testgrades);
Console.WriteLine(name[nameindex] + testgrades[k]);
}
Console.ReadLine();
}
public static void sorted(ref double [] testgrades)
{
double temp = 0;
for (int write = 0; write < testgrades .Length; write++)
{
for (int sort = 0; sort < testgrades.Length - 1; sort++)
{
if (testgrades [sort] <= testgrades [sort + 1])
{
temp = testgrades[sort + 1];
testgrades [sort + 1] = testgrades [sort];
testgrades [sort] = temp;
}
}
}
}
类程序
{
静态void Main(字符串[]参数)
{
整数名长度;
字符串名;
双级、最大值、最小值、平均值;
int nameindex=0;
int-gradeindex=0;
Console.WriteLine(“请输入您希望输入的名称数量:”);
namelength=Convert.ToInt32(Console.ReadLine());
字符串[]名称=新字符串[namelength];
double[]testgrades=新的double[namelength];
for(int i=0;i 如果(testgrades[sort]创建自定义类型,例如:
public class NameGrade
{
public string Name;
public double Grade;
}
然后只使用该类型的一个数组。用数据填充它,然后对元素进行排序。您可以使用扩展方法(使用System.Linq
):NameGrade[]sorted=myArray.OrderBy(x=>x.Grade).ToArray();
编辑:
看起来像是Array.Sort(键、值)
执行此操作。但是最好使用自定义类型(更好的代码可读性)。创建自定义类型,例如:
public class NameGrade
{
public string Name;
public double Grade;
}
然后只使用该类型的一个数组。用数据填充它,然后对元素进行排序。您可以使用扩展方法(使用System.Linq
):NameGrade[]sorted=myArray.OrderBy(x=>x.Grade).ToArray();
编辑:
看起来像是Array.Sort(key,values)
完成了这项工作。但是最好使用自定义类型(更好的代码可读性)。数组中有一个超负荷的Array.Sort
,它接受两个数组;一个用于键,一个用于项。这两个数组中的项都根据键数组进行排序:
Array.Sort(testgrades, names);
如果无法从此重载中获得结果,则可以创建自定义比较器并将其作为第三个参数传递。存在数组重载。Sort
接受两个数组;一个用于键,一个用于项。这两个数组的项都根据键数组进行排序:
Array.Sort(testgrades, names);
如果无法从此重载中获得结果,可以创建自定义比较器并将其作为第三个参数传递。简短回答更改此选项:
for (int k = 0; k < namelength; k++)
{
sorted(ref testgrades);
Console.WriteLine(name[nameindex] + testgrades[k]);
}
长答覆:
有几件事:
您不需要通过引用传递testGrades
数组。C#将通过引用传递此数组,因为数组不是值类型
不要从循环中调用sorted
方法,因为您会不断对相同的值进行排序
我认为您的指导老师可能要求您自己进行排序,而不是使用库调用,但是如果允许您使用Linq,因为您已经使用了它,那么您也可以使用Linq对arry进行排序。使用将升序排序的OrderBy
,使用将降序排序的OrderByDescending
您有以下代码:
for (int i = 0; i < testgrades.Length; i++)
{
Console.WriteLine("Please enter the names of each student");
names = Convert.ToString(Console.ReadLine());
name[i] += names;
nameindex = i;
}
for(int i=0;i
请参阅变量nameindex
在循环后将具有最后一个i
值。因此,当您稍后在排序后写入名称时,您将始终显示相同的名称(输入的姓氏)。简短回答更改此项:
for (int k = 0; k < namelength; k++)
{
sorted(ref testgrades);
Console.WriteLine(name[nameindex] + testgrades[k]);
}
长答覆:
有几件事:
您不需要通过引用传递testGrades
数组。C#将通过引用传递此数组,因为数组不是值类型
不要从循环中调用sorted
方法,因为您会不断对相同的值进行排序
我认为您的指导老师可能要求您自己进行排序,而不是使用库调用,但是如果允许您使用Linq,因为您已经使用了它,那么您也可以使用Linq对arry进行排序。使用将升序排序的OrderBy
,使用将降序排序的OrderByDescending
您有以下代码:
for (int i = 0; i < testgrades.Length; i++)
{
Console.WriteLine("Please enter the names of each student");
names = Convert.ToString(Console.ReadLine());
name[i] += names;
nameindex = i;
}
for(int i=0;i
请参阅变量nameindex
在循环后将具有最后一个i
值。因此,当您稍后在排序后写入名称时,您将始终显示相同的名称(输入的最后一个名称).你只是在对分数进行排序,这意味着即使分数移动,你各自的名字也会保持在同一个位置。所以我必须进行排序