VB .Net Получает имя переменной integers, имеющей значение loweset

#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}
 

Теперь индекс также подразумевает переменную.