我是业余程序员,与朋友合作,无法找到解决我们编码困境的方法。
我们需要能够比较变量是否匹配在第二个变量中找到的数据,但是要搜索的第一个变量将依赖于第三个变量的内容。 (第三个变量将命名要搜索的第一个变量)
Var1, Var2, Var3 ... Var100 'Each with their own values and datatypes;
Var45 = 25
Vartocheck1 = "Var45"
Vattocheck2 = 25
If Vartocheck1 = Vartocheck2 Then
(Stuff)
End If
基本上,我想知道是否有一种比较两个变量的好方法,很可能是在If-then语句中,其中两个变量之一由第三个变量的内容决定。
这个想法是Vartocheck1将是一个字符串,包含变量的名称,其值我要检查Vartocheck2。问题是代码中的变量(在我的例子中:Var1,Var2,Var3 ...... Var100)被定义为流程运行,但外部excel图表在被引用时可以在程序期间更改某些变量'执行。我可以用大约一百万个嵌套的if-then语句完成我需要的东西,但这很慢而且很混乱,我希望还有另一种方法。
我已经研究过数组,但实现数组的大量数量和大小将是令人生畏的,需要整个项目重写。
有没有比较像这样的变量的好方法?
答案 0 :(得分:1)
您正在寻找的是一种称为反射的概念。这个SO问题解释了它:
How to get the variable names types, and values in the current class or Method in VB.net?
基于此,我已经快速创建了以下类:
Public Class Class1
Public This As String
Public That As Boolean
Public Function ListVar() As Boolean
Dim fields As System.Reflection.FieldInfo() = Me.GetType().GetFields()
For Each fld As System.Reflection.FieldInfo In fields
Dim name As String = fld.Name
Dim value = fld.GetValue(Me)
Dim typ As Type = fld.FieldType
Debug.Print(name)
Next
Return True
End Function
End Class
您可以通过以下方式从任何地方调用ListVar函数:
Dim c As New Class1
c.ListVar()
显然这不是生产准备,但应该给你一个开始。
答案 1 :(得分:0)
虽然我仍然认为这是一个XY问题,但.net中的一个方便容器是a dictionary。这允许您存储可以是任何类型的键值对。这为您提供了一些数据库获得的工具(在这种情况下可能是更好的解决方案)。例如:
Imports System.Collections.Generic
Module Module1
Dim ValueDict As New Dictionary(Of String, Integer)
Sub Main()
Dim r As New Random
'Fill the dictionary with keys "Var1" -> "Var100"
'Fill the values with random integers
For i As Integer = 1 To 100
ValueDict.Add("Var" & i.ToString, r.Next)
Next
'Extract a variable by name
Dim extractedVar As Integer
If ValueDict.TryGetValue("Var23", extractedVar) Then
Console.WriteLine("Var23 has value :" & extractedVar.ToString())
Else
Console.WriteLine("Var23 does not exist in the dictionary")
End If
'enumerate all values
For Each valuePair As KeyValuePair(Of String, Integer) In ValueDict
Console.WriteLine("Variable " & valuePair.Key & _
" = " & valuePair.Value.ToString())
Next
'Get a variable by number
Dim varNumber As Integer = 72
If ValueDict.TryGetValue("Var" & varNumber.ToString(), extractedVar) Then
Console.WriteLine("Var" & varNumber.ToString() & _
" has value :" & extractedVar.ToString())
Else
Console.WriteLine("Var" & varNumber.ToString() & _
" does not exist in the dictionary")
End If
Console.ReadLine()
End Sub
End Module
其他类型的操作:
'Check if value exists, Assign a new value or update an existing value
Dim newVal As Integer = 12345
Dim varName As String = "Var147"
If Not ValueDict.ContainsKey(varName) Then
Console.WriteLine(varName & " does not currently exist")
End If
ValueDict.Item(varName) = newVal
Console.WriteLine(varName & " now has value :" & ValueDict.Item(varName).ToString())
'Delete a value
ValueDict.Remove(varName)
If Not ValueDict.ContainsKey(varName) Then
Console.WriteLine(varName & " does not currently exist")
End If