Пошаговый поиск таблицы в VB?

#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
 

Посмотрите, как это работает здесь:

https://dotnetfiddle.net/CKTNCE

Лично, однако, я предпочитаю использовать минимальную оценку вместо максимальной для границ. Я нахожу, что гораздо более вероятно, что у вас будет дополнительный зачет с баллом выше 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 в данном случае) и возвращает первый элемент, соответствующий функции анонимного предиката.