【发布时间】:2021-08-29 02:25:30
【问题描述】:
我在 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 的变量。??????结构。
【问题讨论】:
-
这到底应该做什么:
.Mean = InputData.Average(Function(f) f.ID)?就目前而言,您得到了所有ID值的平均值,这似乎没有意义。我怀疑您真正想要的是获取所有元素的其他字段的平均值,其中ID等于某个特定值。那是对的吗?如果是这样,那么您需要先调用Where来过滤数据,然后调用Average并指定要获取平均值的字段,例如.Mean = InputData.Where(Function(f) f.ID = ID).Average(Function(f) f.Top). -
@jmcilhinney 可能 ID 具有误导性,因为它在代码中出现了两次。我想做一个非常简单的事情,例如以下 6 个平均值:
InputData.Average(Function(f) f.Top) - InputData.Average(Function(f) f.Bottom) - InputData.Average(Function(f) f.Right) - InputData.Average(Function(f) f.Left) - InputData.Average(Function(f) f.OffCutHTop) - InputData.Average(Function(f) f.OffCutV)但我不知道如何更改为f.Top, f.Bottom, f.Right, f.Left, f.OffCutH and f.OffCutV之间的for循环 -
看起来好像您想要具有 6 个元素的数组,因为您正在谈论平均 6 个字段。如果是这种情况,那么您创建数组的方式,例如
Dim VariablesParameter(6) As VariablesParameterStructure,错了。这将创建一个包含 7 个元素的数组。在VB中创建数组时指定上限,比长度小1。 -
您的代码中还有一些拼写错误。您在两个地方有“Analisys”而不是“Analysis”,在一个地方有“Strucutre”而不是“Structure”。您还必须拥有
Option Strict Off才能编译该代码,这很糟糕。为什么您认为在For循环中使用Byte来索引数组是个好主意?索引总是Integers。将此项目转为Option Strict On,并将其设置为所有项目的 VS 选项中的默认值,并帮助您停止编写糟糕的代码。