【问题标题】:vb.net indexof list of classvb.net indexof类列表
【发布时间】: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)

标签: vb.net list class indexof


【解决方案1】:

感谢@Plutonix 的帮助!

下面是现在工作的代码:

Imports System.Linq

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 item As stockstatus = ssr.Where(Function(x) x.part = "CP0065-10N-S").FirstOrDefault
        If item IsNot Nothing Then
            Dim ndx As Integer = ssr.IndexOf(item)
            MsgBox(ndx)   'This works now.  It returns 1.
        End If

    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 = New stockstatus
        ss.part = "CP0065-10N-S"
        ss.qty = 1000.0R
        ss.cost = 0.001R
        s.Add(ss)
        Return s
    End Function

End Class

【讨论】:

  • 其实FirstOrDefault在找不到的时候会返回Nothing,你需要测试一下。我加了
  • @Plutonix 谢谢!您有推荐作为 Linq 参考的网站吗?看来学习 Linq 对我正在做的事情来说是个好主意。
猜你喜欢
  • 2013-03-21
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2015-01-08
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多