C# 在没有数组的情况下排序多维数组。排序还是数据网格?
我创建了这个for循环,这样当我单击一个按钮时,我可以查看同学们的成绩,如下所示:C# 在没有数组的情况下排序多维数组。排序还是数据网格?,c#,winforms,C#,Winforms,我创建了这个for循环,这样当我单击一个按钮时,我可以查看同学们的成绩,如下所示: Name Test Basket Destructive Final Grade Alex 10 10 10 10 Danny 20 20 20 20 Dave 35 40 50 40 Goerge 0 0 0
Name Test Basket Destructive Final Grade
Alex 10 10 10 10
Danny 20 20 20 20
Dave 35 40 50 40
Goerge 0 0 0 0
Hannan 0 0 0 0
Ian 0 0 0 0
Muna 0 0 0 0
下面是它的代码:
private void uiShowMarksAZButton_Click(object sender, EventArgs e)
{
uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
uiMarksDisplayTextBox.Text += System.Environment.NewLine;
for (int i = 0; i < Names.Length; i++)
{
uiMarksDisplayTextBox.Text += Names[i];
for (int x = 0; x < 3; x++)
{
uiMarksDisplayTextBox.Text += "\t" + Grade[i, x];
}
uiMarksDisplayTextBox.Text += "\t" + "\t" + FinalGrade[i];
uiMarksDisplayTextBox.Text += System.Environment.NewLine;
}
}
对于目前的问题,这里有一个高级算法: 首先确保所有数组的长度相同 然后应用你最喜欢的排序算法(我建议初学者使用冒泡排序。最差的排序算法,但最容易学习) 无论何时交换FinalGrade数组中的元素,都会交换相同索引的其他数组中的元素 例如,如果您在FinalGrade中交换了索引1和索引3,那么您还将交换所有其他数组的元素1和3
我将把实际的编码留作练习。我认为你不能只循环一次。您可以尝试一些如下的递归逻辑来保持循环,直到所有事情都排序
private List<YourObject> Sort(FinalGrade){
bool finished = true;
for (int x = 0; x < FinalGrade.Length; x++)
{
for (int j = x + 1; j < FinalGrade.Length; j++)
{
if (FinalGrade[x] > FinalGrade[j])
{
temp = FinalGrade[j];
FinalGrade[j] = FinalGrade[x];
FinalGrade[x] = temp;
finished = false;
}
}
}
return finished? FinalGrade : Sort(FinalGrade)
}
私有列表排序(FinalGrade){
bool finished=true;
对于(int x=0;x最终等级[j])
{
温度=最终等级[j];
最终等级[j]=最终等级[x];
最终等级[x]=温度;
完成=错误;
}
}
}
返回完成?最终版本:排序(最终版本)
}
您可以使用此选项对数据进行排序:
var input = new IComparable[][]
{
new IComparable[] {"Alex", 10, 10, 10, 10},
new IComparable[] {"Danny", 20, 20, 20, 20},
new IComparable[] {"Dave", 35, 40, 50, 40},
new IComparable[] {"Goerge",0 , 0 , 0 , 0 },
new IComparable[] {"Hannan",0 , 0 , 0 , 0 },
new IComparable[] {"Ian", 0 , 0 , 0 , 0 },
new IComparable[] {"Muna", 0 , 0 , 0 , 0 },
};
var indexOfColumnToOrderBy = 4; // "Final Grade" field
for (var i = 0; i < input.Length - 1; ++i)
{
for (var j = i + 1; j < input.Length; ++j)
{
IComparable[] t;
if (input[i][indexOfColumnToOrderBy].CompareTo(input[j][indexOfColumnToOrderBy]) < 0)
{
t = input[i];
input[i] = input[j];
input[j] = t;
}
}
}
像这样定义您的输入
var input = new Student[]
{
new Student {Name = "Alex", Test = 10, Basket = 10, Destructive = 10, FinalGrade = 10},
new Student {Name = "Danny", Test = 20, Basket = 20, Destructive = 20, FinalGrade = 20, },
new Student {Name = "Dave", Test = 35, Basket = 40, Destructive = 50, FinalGrade = 40, },
new Student {Name = "Goerge", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
new Student {Name = "Hannan", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
new Student {Name = "Ian", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
new Student {Name = "Muna", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
};
并使用Linq进行排序:
var sorted = input.OrderByDescending(student => student.FinalGrade).ToArray();
即使这种方法不能满足教授的要求,你也可以用它来调试你自己的算法使用一个类比跨多个数组存储数据要容易得多我知道,但我目前受到教授想要的限制,没有简单的方法!你需要和你的教授谈谈,欢迎他来到21世纪。理解分类和不在课堂上分组是完全不同的。他完全可以教排序,同时教你正确的编码方法。我同意Aldert的观点,你应该去告诉你的教授他做错了,并欢迎他加入OOP centuryDismissing
数组。假设你仍然可以使用List.Sort
或Enumerable.OrderBy
:-)排序并不是问题我将如何显示这个?抱歉,我几乎不理解它,更不用说在我的代码中实现它了。@UnboundPhantom如果我们谈论控制台,你可以用foreach循环显示初始数组或排序数组,比如foreach(输入中的var行){console.WriteLine(string.Join(,\t),row.AsEnumerable());
。如果我们谈论“如何在WinForms中显示锯齿数组”--这是一个与订购无关的新问题。您可以在单独的线程中使用它
private class Student
{
public string Name { get; set; }
public int Test { get; set; }
public int Basket { get; set; }
public int Destructive { get; set; }
public int FinalGrade { get; set; }
}
var input = new Student[]
{
new Student {Name = "Alex", Test = 10, Basket = 10, Destructive = 10, FinalGrade = 10},
new Student {Name = "Danny", Test = 20, Basket = 20, Destructive = 20, FinalGrade = 20, },
new Student {Name = "Dave", Test = 35, Basket = 40, Destructive = 50, FinalGrade = 40, },
new Student {Name = "Goerge", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
new Student {Name = "Hannan", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
new Student {Name = "Ian", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
new Student {Name = "Muna", Test = 0, Basket = 0, Destructive = 0, FinalGrade = 0, },
};
var sorted = input.OrderByDescending(student => student.FinalGrade).ToArray();