【发布时间】:2016-03-07 07:49:12
【问题描述】:
我正在处理的一大段代码中遇到问题,因此我创建了一小段代码来显示该问题。我创建了一个代表库存项目的类 (stockstatus)。它们具有部件号 (.part)、数量 (.qty) 和成本 (.cost)。我创建了该类的列表 (ssr) 来表示整个库存。我现在正在尝试在该库存中搜索特定的零件编号,但遇到了麻烦。
如果我尝试使用 ssr.IndexOf,它希望将 stockstatus 传递给 IndexOf 函数。如果我使用初始化为第二个部件号(“CP0065-10N-S”)的基础 .part 创建 stockstatus,IndexOf 函数始终返回 -1。我认为 .qty 和 .cost 也必须匹配 IndexOf 才能返回正确的索引,但我无法知道我正在处理的代码中的这些值。我需要能够仅基于搜索 .part 来找到索引。最简单的方法是什么?
Public Class stockstatus
Public part As String
Public qty As Double
Public cost As Double
End Class
Public Partial Class MainForm
Public ssr As New List(Of stockstatus)
Public Sub New()
Me.InitializeComponent()
End Sub
Sub MainFormLoad(sender As Object, e As EventArgs)
ssr = getSSR()
Dim ss As New stockstatus
ss.part = "CP0065-10N-S"
MsgBox(ssr.IndexOf(ss)) 'returns -1. i want it to return index 1
End Sub
Public Function getSSR() As List(Of stockstatus)
Dim s As New List(Of stockstatus)
Dim ss As New stockstatus
ss.part = "CP0065-0.1U-S"
ss.qty = 1000.0R
ss.cost = 0.001R
s.Add(ss)
ss.part = "CP0065-10N-S"
ss.qty = 2000.0R
ss.cost = 0.002R
s.Add(ss)
Return s
End Function
End Class
【问题讨论】:
-
顺便说一句...我认为如果我指定了成本和数量,IndexOf 会起作用,但我尝试了:ss.part = "CP0065-10N-S" ss.qty = 2000.0R ss.cost = 0.002R MsgBox(ssr.IndexOf(ss)) 仍然返回-1,所以我一定是偏离了轨道。
-
当然,无法工作,您正在尝试查找不在列表中的对象。您必须覆盖 stockstatus 的 Equals 和 GetHashCode 方法,以便它们只使用 part 成员。或者只是使用 Linq 表达式。或者如果 Linq 不是你的一杯茶,则使用 For 循环。
-
使用字典并使用零件号作为键。
-
您的另一个选择是不使用 LIST(),而是使用带有键的东西,例如哈希表或字典,因此当您将其添加到列表时,您会包含要搜索的键。
-
如果这是一个真正的应用程序,一个实际的集合类可能比表单中的公共集合更好。该集合仅在该表单打开时可用。
Dim item = stockItems.Where(Function(x) x.PartName = "CP0065-10N-S").FirstOrDefault。那么如果你真的想要索引:Dim ndx = stockItems.IndexOf(item)