设置字符串变量以从结构化数组中获取值
Setting string a variable to get values from a structured array
我在 VB.net 中有一个简单的问题。
我想使用字符串从声明为结构的数组中检索数据以可视化变量。
在我的代码下方:
Module DataAnalisys
Dim InputData(100000) As InputDataStructure
Dim VariablesParameter(6) As VariablesParameterStructure
Dim VariablesGlobal(6) As VariablesDataStrucutre
Structure InputDataStructure
Dim ID As Integer
Dim FileId As Integer
Dim ProductionDate As Date
Dim ProductionTime As Date
Dim Shift As Integer
Dim IPP As Integer
Dim BPS As Integer
Dim SerialNumber As String
Dim Top As Single
Dim Bottom As Single
Dim Right As Single
Dim Left As Single
Dim OffCutH As Single
Dim OffCutV As Single
Dim Row As Byte
Dim Col As String
Dim Position As String
Dim Pack As Integer
Dim Sheet As Integer
Dim SheetInPack As Integer
End Structure
Structure VariablesParameterStructure
Dim NameParameter As String
Dim Target As Single
Dim Tolerance As Single
Dim LowTolerance As Single
Dim UppTolerance As Single
End Structure
Structure VariablesDataStrucutre
Dim NameData As String
Dim Position As String
Dim N As Long
Dim Mean As Single
Dim Difference As Single
Dim Scrap As Single
Dim ScrapGreat As Single
Dim ScrapLess As Single
Dim SeMean As Single
Dim StDev As Single
Dim Min As Single
Dim Q1 As Single
Dim Median As Single
Dim Q3 As Single
Dim Max As Single
End Structure
Sub RoutineAnalisysGlobal()
For B As Byte = 0 To VariablesGlobal.Length - 1
Dim ID As String = VariablesParameter(B).NameParameter
Dim Target As Single = VariablesParameter(B).Target
Dim LowTol As Single = VariablesParameter(B).LowTolerance
Dim UppTol As Single = VariablesParameter(B).UppTolerance
With VariablesGlobal(B)
.NameData = ID
.Position = "All"
.N = InputData.Length
.Mean = InputData.Average(Function(f) f.ID)
.Difference = .Mean - Target
.ScrapLess = InputData.Count(Function(f) f.ID < LowTol)
.ScrapGreat = InputData.Count(Function(f) f.ID > UppTol)
.Q1 = InputData.FirstQuartile(Function(F) F.ID)
.Min = InputData.Min(Function(f) f.ID)
.Median = InputdataMedian(Function(f) f.ID)
.Q3 = InputData.ThirdQuartile(Function(f) f.ID)
.Max = InputData.Max(Function(f) f.ID)
End With
Next
End Sub
End Module
VariablesParameter().Name 是 Top、Bottom、Right、Left、OffCutH 和 OffCutV。
当我使用部分 (Function(f) f.ID) 时代码不起作用,因为我想根据 for 循环在 InputData 结构的不同项目上使用该函数。我想显示 f.Top f.Bottom f.Right f.Left f.OffCutH 和 f.OffCutV.
有人愿意帮助我吗?我在看如何将字符串 ID 转换为 InputData 的变量。??????结构。
我想你要找的是这样的:
Dim functions As Func(Of InputDataStructure, Single)() = {Function(ids) ids.Top,
Function(ids) ids.Bottom,
Function(ids) ids.Right,
Function(ids) ids.Left,
Function(ids) ids.OffCutH,
Function(ids) ids.OffCutV}
For i = 0 To VariablesGlobal.GetUpperBound(0)
With VariablesGlobal(i)
'...
.Mean = InputData.Average(functions(i))
'...
End With
Next
作为解释,此行的 Function(f) f.ID
部分:
.Mean = InputData.Average(Function(f) f.ID)
是一个 lambda 表达式,即匿名方法的委托。您正在调用的 Average
方法需要一个方法的委托,该方法具有 T
类型的单个参数,其中 T
与您调用的 IEnumerable(Of T)
的泛型类型相匹配'正在调用它,并且 returns 一个数字类型的值,例如Integer
或 Single
。在你的例子中,你在 InputData
上调用 Average
,它实现了 IEnumerable(Of InputDataStructure)
。您的 lambda 表达式有一个类型为 InputDataStructure
和 returns 和 Integer
的参数,因此它适用于 Average
。 Average
方法为列表中的每个项目调用该委托,获取所有数值结果,然后将其除以列表中的项目数以获得平均值。
为了更清楚那里发生了什么,您可以使用命名方法而不是 lambda 表达式。你可以写这个方法:
Private Function GetID(f As InputDataStructure) As Integer
Return f.ID
End Function
然后将您的代码更改为:
.Mean = InputData.Average(AddressOf GetID)
希望您能识别该命名方法中与 lambda 表达式对应的部分以及推断的部分。
现在,您有许多代码行使用相同的 lambda 表达式,例如
.Min = InputData.Min(Function(f) f.ID)
.Median = InputdataMedian(Function(f) f.ID)
.Q3 = InputData.ThirdQuartile(Function(f) f.ID)
对于如此简单的事情,习惯上按照你的方式去做。不过,您确实可以选择编写一次 lambda 表达式,将其分配给一个变量,然后多次使用该变量。你可以这样做:
Dim f As Func(Of InputDataStructure, Integer) = Function(ids) ids.ID
或者这个:
Dim f = Function(ids As InputDataStructure) ids.ID
以变量 f
结束,该变量引用接受类型为 InputDataStructure
的参数和 returns 类型为 Integer
的值的委托。然后,您可以在之前使用多个 lambda 表达式的地方使用该变量:
.Min = InputData.Min(f)
.Median = InputdataMedian(f)
.Q3 = InputData.ThirdQuartile(f)
因此,既然我们确定您所需要的只是一个接受正确类型参数和 returns 正确类型参数的方法的委托,请再看一下我发布的代码。它首先创建一个包含六个委托的数组,每个委托接受一个 InputDataStructure
类型的参数和 returns 一个 Single
类型的值。然后,您可以在需要此类委托的任何地方使用该数组的元素。
这意味着您可以遍历该数组并将每个委托传递给所有需要此类委托的扩展方法,包括 Average
。如果您在索引 0 处获得委托,那么您将获得 returns Top
属性 值的委托,因此 Average
将获得平均 Top
值。如果您使用索引 5,那么您将获得 returns OffCutV
属性 值的代表,因此 Average
将获得平均 OffCutV
值。等等
作为记录,我建议在指示类型的 lambda 中使用参数名称。您使用了 f
但这毫无意义。参数类型是 InputDataStructure
所以 ids
表示。
我在 VB.net 中有一个简单的问题。 我想使用字符串从声明为结构的数组中检索数据以可视化变量。 在我的代码下方:
Module DataAnalisys
Dim InputData(100000) As InputDataStructure
Dim VariablesParameter(6) As VariablesParameterStructure
Dim VariablesGlobal(6) As VariablesDataStrucutre
Structure InputDataStructure
Dim ID As Integer
Dim FileId As Integer
Dim ProductionDate As Date
Dim ProductionTime As Date
Dim Shift As Integer
Dim IPP As Integer
Dim BPS As Integer
Dim SerialNumber As String
Dim Top As Single
Dim Bottom As Single
Dim Right As Single
Dim Left As Single
Dim OffCutH As Single
Dim OffCutV As Single
Dim Row As Byte
Dim Col As String
Dim Position As String
Dim Pack As Integer
Dim Sheet As Integer
Dim SheetInPack As Integer
End Structure
Structure VariablesParameterStructure
Dim NameParameter As String
Dim Target As Single
Dim Tolerance As Single
Dim LowTolerance As Single
Dim UppTolerance As Single
End Structure
Structure VariablesDataStrucutre
Dim NameData As String
Dim Position As String
Dim N As Long
Dim Mean As Single
Dim Difference As Single
Dim Scrap As Single
Dim ScrapGreat As Single
Dim ScrapLess As Single
Dim SeMean As Single
Dim StDev As Single
Dim Min As Single
Dim Q1 As Single
Dim Median As Single
Dim Q3 As Single
Dim Max As Single
End Structure
Sub RoutineAnalisysGlobal()
For B As Byte = 0 To VariablesGlobal.Length - 1
Dim ID As String = VariablesParameter(B).NameParameter
Dim Target As Single = VariablesParameter(B).Target
Dim LowTol As Single = VariablesParameter(B).LowTolerance
Dim UppTol As Single = VariablesParameter(B).UppTolerance
With VariablesGlobal(B)
.NameData = ID
.Position = "All"
.N = InputData.Length
.Mean = InputData.Average(Function(f) f.ID)
.Difference = .Mean - Target
.ScrapLess = InputData.Count(Function(f) f.ID < LowTol)
.ScrapGreat = InputData.Count(Function(f) f.ID > UppTol)
.Q1 = InputData.FirstQuartile(Function(F) F.ID)
.Min = InputData.Min(Function(f) f.ID)
.Median = InputdataMedian(Function(f) f.ID)
.Q3 = InputData.ThirdQuartile(Function(f) f.ID)
.Max = InputData.Max(Function(f) f.ID)
End With
Next
End Sub
End Module
VariablesParameter().Name 是 Top、Bottom、Right、Left、OffCutH 和 OffCutV。
当我使用部分 (Function(f) f.ID) 时代码不起作用,因为我想根据 for 循环在 InputData 结构的不同项目上使用该函数。我想显示 f.Top f.Bottom f.Right f.Left f.OffCutH 和 f.OffCutV.
有人愿意帮助我吗?我在看如何将字符串 ID 转换为 InputData 的变量。??????结构。
我想你要找的是这样的:
Dim functions As Func(Of InputDataStructure, Single)() = {Function(ids) ids.Top,
Function(ids) ids.Bottom,
Function(ids) ids.Right,
Function(ids) ids.Left,
Function(ids) ids.OffCutH,
Function(ids) ids.OffCutV}
For i = 0 To VariablesGlobal.GetUpperBound(0)
With VariablesGlobal(i)
'...
.Mean = InputData.Average(functions(i))
'...
End With
Next
作为解释,此行的 Function(f) f.ID
部分:
.Mean = InputData.Average(Function(f) f.ID)
是一个 lambda 表达式,即匿名方法的委托。您正在调用的 Average
方法需要一个方法的委托,该方法具有 T
类型的单个参数,其中 T
与您调用的 IEnumerable(Of T)
的泛型类型相匹配'正在调用它,并且 returns 一个数字类型的值,例如Integer
或 Single
。在你的例子中,你在 InputData
上调用 Average
,它实现了 IEnumerable(Of InputDataStructure)
。您的 lambda 表达式有一个类型为 InputDataStructure
和 returns 和 Integer
的参数,因此它适用于 Average
。 Average
方法为列表中的每个项目调用该委托,获取所有数值结果,然后将其除以列表中的项目数以获得平均值。
为了更清楚那里发生了什么,您可以使用命名方法而不是 lambda 表达式。你可以写这个方法:
Private Function GetID(f As InputDataStructure) As Integer
Return f.ID
End Function
然后将您的代码更改为:
.Mean = InputData.Average(AddressOf GetID)
希望您能识别该命名方法中与 lambda 表达式对应的部分以及推断的部分。
现在,您有许多代码行使用相同的 lambda 表达式,例如
.Min = InputData.Min(Function(f) f.ID)
.Median = InputdataMedian(Function(f) f.ID)
.Q3 = InputData.ThirdQuartile(Function(f) f.ID)
对于如此简单的事情,习惯上按照你的方式去做。不过,您确实可以选择编写一次 lambda 表达式,将其分配给一个变量,然后多次使用该变量。你可以这样做:
Dim f As Func(Of InputDataStructure, Integer) = Function(ids) ids.ID
或者这个:
Dim f = Function(ids As InputDataStructure) ids.ID
以变量 f
结束,该变量引用接受类型为 InputDataStructure
的参数和 returns 类型为 Integer
的值的委托。然后,您可以在之前使用多个 lambda 表达式的地方使用该变量:
.Min = InputData.Min(f)
.Median = InputdataMedian(f)
.Q3 = InputData.ThirdQuartile(f)
因此,既然我们确定您所需要的只是一个接受正确类型参数和 returns 正确类型参数的方法的委托,请再看一下我发布的代码。它首先创建一个包含六个委托的数组,每个委托接受一个 InputDataStructure
类型的参数和 returns 一个 Single
类型的值。然后,您可以在需要此类委托的任何地方使用该数组的元素。
这意味着您可以遍历该数组并将每个委托传递给所有需要此类委托的扩展方法,包括 Average
。如果您在索引 0 处获得委托,那么您将获得 returns Top
属性 值的委托,因此 Average
将获得平均 Top
值。如果您使用索引 5,那么您将获得 returns OffCutV
属性 值的代表,因此 Average
将获得平均 OffCutV
值。等等
作为记录,我建议在指示类型的 lambda 中使用参数名称。您使用了 f
但这毫无意义。参数类型是 InputDataStructure
所以 ids
表示。