你好我们正在研究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`
答案 0 :(得分:4)
正如其他人所建议的那样,使用强类型集合而不是ArrayList
。您可能希望成绩为Integer
而不是String
。对于单位数的成绩而言,这可能无关紧要,但可能会有些奇怪。
如果您将gradeList
变量更改为List(Of Integer)
并启用Option Strict
,您会发现标签文字为String
。您可以使用CInt
或Integer.Parse
转换为Integer
。 They 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