如何在VB.net中对数组进行排序?

时间:2014-05-22 19:45:19

标签: vb.net

你好我们正在研究vb.net中的一个窗口应用程序我试图编写一个数组,它只能从学生完成的10个科目中添加8个最佳科目成绩。十个科目成绩显示为标签,最佳八个科目成绩的总计显示为标签。任何一个人来帮助我。我是编程新手。这是我的代码。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    ' subject grades
    Label1.Text = 7
    Label2.Text = 1
    Label3.Text = 3
    Label4.Text = 8
    Label5.Text = 4
    Label6.Text = 9
    Label7.Text = 2
    Label8.Text = 5
    Label9.Text = 2
    Label10.Text = 6

    Dim gradeList As New ArrayList()
    gradeList.Add(Label1.Text)
    gradeList.Add(Label2.Text)
    gradeList.Add(Label3.Text)
    gradeList.Add(Label4.Text)
    gradeList.Add(Label5.Text)
    gradeList.Add(Label6.Text)
    gradeList.Add(Label7.Text)
    gradeList.Add(Label8.Text)
    gradeList.Add(Label9.Text)
    gradeList.Add(Label10.Text)


    'sort grades in an arraylist
    gradeList.Sort()

    ' Please guys help me and modify this code to sort and  SUM UP ONLY best eight done subject grades.
    ' I want label11.text to display the answer 
    'THANKS.

End Sub`

2 个答案:

答案 0 :(得分:4)

正如其他人所建议的那样,使用强类型集合而不是ArrayList。您可能希望成绩为Integer而不是String。对于单位数的成绩而言,这可能无关紧要,但可能会有些奇怪。

如果您将gradeList变量更改为List(Of Integer)并启用Option Strict,您会发现标签文字为String。您可以使用CIntInteger.Parse转换为IntegerThey aren't quite the same

您已经在代码中对列表进行了排序,所以您真正要问的是“如何对列表中的前8项进行求和?

如果您考虑这个问题,您应该能够编写一个For循环来执行此操作。

您也可以使用单行LINQ表达式执行您想要的操作:

Dim sum As Integer = (From grade In gradeList Select grade Order By grade Descending).Take(8).Sum()

答案 1 :(得分:1)

将数字排序为字符串会导致问题。例如,如果您在成绩中添加10某个位置并对数组列表进行排序,请执行以下操作:

Dim gradeList As New ArrayList()
gradeList.Add("7")
gradeList.Add("1")
gradeList.Add("3")
gradeList.Add("8")
gradeList.Add("10") '! watch out
' sort string
gradeList.Sort()
' output sorted strings
for each grade in gradeList
    Console.WriteLine(grade)
next grade

输出是:

1
10
3
7
8

显然错误,因为数字被比较为文字,所有以 1 开头的内容都是在这种情况下少于3

问题很容易解决:

  • 将文字转换为数字(或将它们作为整数直接添加到列表中)
  • 将它们列入清单
  • 对列表进行排序(默认顺序为升序)
  • 反转排序列表(使排序降序)
  • 从列表中取第一个(最大)和第二个元素(第二大)并将它们相加

使用List和LINQ的解决方案可能如下所示:

' list of integers to be sorted
dim grades as List(of integer) = new List(of integer)
' helper variable holding the parsed grade
dim g as Integer
' convert literals if possible to integers and put them in the list
for each grade in gradeList
    if Integer.TryParse(grade, g) then
        grades.Add(g)
    end if
next grade
' sort the grades as numbers (default is ascending order)
grades.Sort()
' invert the order = descending order
grades.Reverse()
' take the highest two and sum them
dim sum as integer = grades(0) + grades(1)
' or using LINQ ...
'dim sum as integer = grades.Take(1).First() + grades.Skip(1).Take(1).First()
Console.WriteLine(sum)

在这种情况下输出:

10
8
7
3
1

总和是:

18