我的程序包含:
" ADD"每次单击它时按钮都会保存结构中的所有数据
" SAVE"按钮将结构中的所有项目保存到xml文件
单击“添加”按钮后,保存所有数据已成功。
如果数据/元素键已经存在,我想要比较。
如果数据/元素已经存在,那么msgbox("ID ALREADY EXIST")
如果没有继续添加
所以我开始用这段代码编码,问题是,它只比较第一个元素而不是其他元素。请帮忙。
Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim index As Integer = Nothing
If ioDevice IsNot Nothing Then
index = ioDevice.Length
Else
index = 0
End If
ReDim Preserve ioDevice(index)
Dim i As Integer = 0
With ioDevice(index)
Do
If ioDevice IsNot Nothing AndAlso ioDevice(i).DeviceID = TextBox1.Text = False Then
MsgBox("PROCEED")
.DeviceID = device.DeviceID
.ConfigFile = device.ConfigFile
.Dll = device.Dll
Else
MsgBox("ALREADY EXIST")
device.DeviceID = vbEmpty
End If
i = i + 1
Loop Until i < ioDevice.Length + 1
End With
End Sub
答案 0 :(得分:0)
你应该改变一些事情。
不使用ioDevice
数组,而是使用List(Of ...)
。这样更容易管理,它避免了ReDim Preserve
,这是非常低效的。
其次,为获取所需参数的设备类型定义构造函数可能是合理的。这样,您可以确保在使用它时设置了所有必填字段。您的设备类型似乎是一种结构。除非你有具体的理由,否则我建议把它变成一个班级。
存在的检查应与实际操作分开。实际上,如果您需要按ID访问设备,则Dictionary(Of ..., ...)
之类的其他数据结构会更合适。但就目前而言,让我们坚持下去。
重命名控件以符合其目的Button2
,而TextBox1
根本不具有表现力。
所以最后,你的代码看起来像这样:
Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim newDeviceId = TextBox1.Text
'Check if it already exists
Dim exists = False
For Each device in ioDevice 'Remember that ioDevice is now a list
If device.DeviceID = newDeviceId Then
exists = True
Exit For
End If
Next
If exists Then
MsgBox("ALREADY EXIST")
Else
MsgBox("PROCEED")
ioDevice.Add(New Device(newDeviceId, ...)) 'Any other parameter you defined in the constructor
End If
End Sub
实际上,使用lambda表达式可以更清晰地完成存在性检查:
Dim exists = ioDevice.Any(Function (device) device.DeviceID = newDeviceId)
如果有任何具有新ID的设备,这将检查整个列表。您可以删除后续的For Each
循环。