#vb.net
Вопрос:
Я использую этот код из книги, которая иллюстрирует пример ступенчатой загрузки таблицы:
Imports System
Imports Microsoft.VisuaLBasic
Public Module Module1
Public Sub Main()
Dim rangeLimit() as Double = {50.0, 65.0, 75.0, 90.0, 100.0}
Dim grade() as String = {"F", "D", "C", "B", "A"}
Dim maxGradeLevel = grade.length - 1
Dim gradeLevel = 0
Dim studentGrade = "A"
Dim studentScore = 50
While((studentGrade = "A") and (gradeLevel < maxGradeLevel))
if(studentScore < rangeLimit(gradeLevel)) then
studentGrade = grade(gradeLevel)
End if
gradeLevel = gradeLevel 100
End While
Print(studentGrade)
End Sub
End Module
Интересно, как это работает и как исправить эту ошибку после компиляции:
Run-time exception (line -1): Conversion from string "A" to type 'Integer' is not valid.
Комментарии:
1. это visual basic
2. Какой Visual Basic? За эти годы он появился во многих формах: VBA, VBScript, VB6 (и более ранние версии), VB.Net и т. Д., И у каждого из них есть свои особые причуды. Основываясь на сообщении об ошибке, это выглядит так . Сеть, но даже там контекст может иметь значение: веб против консоли против wpf против winforms и т. Д
Ответ №1:
Вы, вероятно, хотите Console.WriteLine()
вместо Print()
этого .
Также:
Imports System
Imports System.Linq
Public Module Module1
Public Sub Main()
Dim studentScore As Double = 50.0
Console.WriteLine(GetGrade(studentScore))
End Sub
Public Function GetGrade(score As Double) As String
Dim gradeTable = {
(50.0, "F"),
(65.0, "D"),
(75.0, "C"),
(90.0, "B"),
(100.0, "A")
}
Return gradeTable.First(Function(g) g.Item1 >= Score).Item2
End Function
End Module
Посмотрите, как это работает здесь:
Лично, однако, я предпочитаю использовать минимальную оценку вместо максимальной для границ. Я нахожу, что гораздо более вероятно, что у вас будет дополнительный зачет с баллом выше 100, чем у вас будет что-то, что отправит вам отрицательный балл, и использование максимальных оценок вызывает проблемы в этой ситуации:
Imports System
Imports System.Linq
Public Module Module1
Public Sub Main()
Dim studentScore As Double = 50.0
Console.WriteLine(GetGrade(studentScore))
End Sub
Public Function GetGrade(score As Double) As String
Dim gradeTable = {
(90.0, "A"),
(75.0, "B"),
(65.0, "C"),
(50.0, "D"),
( 0.0, "F")
}
Return gradeTable.First(Function(g) g.Item1 >= Score).Item2
End Function
End Module
Вам также нужно быть осторожным с вашими сравнениями на равенство. >=
и >
означают разные вещи, и только одна из них верна.
Комментарии:
1. Не могли бы вы прокомментировать, какую логику создает этот код?
2. Он использует массив кортежей вместо того, чтобы пытаться сопоставить два массива по индексу (сопоставление массивов по индексу почти никогда не бывает хорошей идеей). Вы можете искать IEnumerable. Первый() в . Чистая документация, но в основном она проходит по элементу (
gradeTable
в данном случае) и возвращает первый элемент, соответствующий функции анонимного предиката.