#vb.net #variables #integer
Вопрос:
Я хочу получить имя переменной, содержащее наименьшее значение из массива целочисленных переменных.
Dim var1 As Integer = 101
Dim var2 As Integer = 14
Dim var3 As Integer = 75
Dim var4 As Integer = 8
Dim var5 As Integer = 9
Dim vals As Integer() = {var1, var2, var3, var4, var5}
Dim smallest As Integer = Integer.MaxValue
For Each element As Integer In vals
smallest = Math.Min(smallest, element)
Next
наименьший = 8, однако как мне получить имя «var4»?
Спасибо
Комментарии:
1. Могу я спросить, почему вам нужно имя переменной, а не ее значение?
Ответ №1:
Вы не можете получить имя переменной, потому что оно не является частью массива, который был заполнен значениями этих переменных. Если индекса недостаточно и вам действительно нужно имя, вам следует подумать об использовании другой коллекции: Dictionary(Of String, Int32)
:
Dim dict As New Dictionary(Of String, Int32)
dict.Add("var1", 101)
dict.Add("var2", 14)
dict.Add("var3", 75)
dict.Add("var4", 8)
dict.Add("var5", 9)
Dim lowestValuePair = dict.OrderBy(Function(pair) pair.Value).First()
Dim name As String = lowestValuePair.Key ' var4
Dim value As Int32 = lowestValuePair.Value ' 8
Я использую методы LINQ OrderBy
и First
здесь, поэтому вам нужно добавить Imports System.Linq
Комментарии:
1. Словари эффективны при поиске по ключу. Накладные расходы на заполнение и перечисление хэш — таблицы здесь не окупаются. Было бы более эффективно использовать
List(Of KeyValuePair(Of String, Int32))
здесь.
Ответ №2:
Имена локальных переменных известны только в тексте Visual Basic до времени компиляции. Они теряются в скомпилированном приложении. Т. е. вы не можете получить к ним доступ во время выполнения.
Вы можете использовать кортежи для хранения имени в виде строки вместе с номером.
Dim namedIntegers As (name As String, value As Integer)() = {
("var1", 101),
("var2", 14),
("var3", 75),
("var4", 8),
("var5", 9)
}
Dim smallest = namedIntegers.OrderBy(Function(x) x.value).First()
Console.WriteLine($"Smallest variable is {smallest.name} = {smallest.value}")
Console.ReadKey()
С принтами
Наименьшая переменная-var4 = 8
Function(x) x.value
это Лямбда-выражение.
Ответ №3:
Вы можете получить индекс в массиве, но не имя переменной:
Dim var1 As Integer = 101
Dim var2 As Integer = 14
Dim var3 As Integer = 75
Dim var4 As Integer = 8
Dim var5 As Integer = 9
Dim vals As Integer() = {var1, var2, var3, var4, var5}
Dim smallest As Integer = Integer.MaxValue
Dim smallestIndex As Integer = 0
For Each i As Integer = 0 To vals.Length - 1
If vals(i) < smallest Then
smallestIndex = i
smallest = vals(i)
End If
Next
Имена переменных предназначены для использования программистами. Если вы предоставляете их пользователю не только для сообщений об ошибках, вы делаете что-то не так.
Может быть, вам нужен такой массив:
Dim var(5) As Integer = {0, 101, 14, 75, 8, 9}
Теперь индекс также подразумевает переменную.