【问题标题】:VB.NET Array/Hashtable IssueVB.NET 数组/哈希表问题
【发布时间】:2010-11-27 23:34:08
【问题描述】:

我正在尝试制作一个哈希表数组。我不知道这是否是最好的解决方案,在 PHP 中我只会做一个多维数组,但在 .NET 中并不那么容易。我是VB的新手,所以如果有更好的解决方案请解释一下。

我有 2 个联系人的电子邮件字段,一个联系人可以有很多。我只想加载编辑页面上的前两个进行编辑,无论它们是什么。

Private Sub loadPrimaryContactEmails(ByVal db As CRMDataDataContext, ByVal contactID As Guid)
        Dim q = (From ce In db.ContactEmails Where ce.ContactID = contactID Select ce).Take(2)
        Dim Emails As Array
        Dim count = 0
        For Each email In q
            Emails(count) = New Hashtable
            Emails(count).Add("email", email.Email)
            Emails(count).Add("label", email.Label)
            Emails(count).Add("id", email.ContactEmailID)
            count = count + 1
        Next
        txtPCEmail1.Text = Emails(0).Item("email")
        txtPCEmail1Label.Text = Emails(0).Item("label")
        lblEmail1ID.Text = Emails(0).Item("id")

        txtPCEmail2.Text = Emails(1).Item("email")
        txtPCEmail2Label.Text = Emails(1).Item("label")
        lblEmail2ID.Text = Emails(1).Item("id")
    End Sub

我第一次尝试引用我的数组时遇到错误:

txtPCEmail1.Text = Emails(0).Item("email")

错误是:

Object variable or With block variable not set.

它会构建,所以我认为它可能会起作用。我不能只遍历我的数据源,因为我必须明确设置文本框字段。有没有更好的方法来做到这一点?或者有没有办法让哈希表数组起作用?

编辑 - 这是好的代码: 所以我去了 HybridDictionary...

Private Sub loadPrimaryContactEmails(ByVal db As CRMDataDataContext, ByVal contactID As Guid)
        Dim q = (From ce In db.ContactEmails Where ce.ContactID = contactID Select ce).Take(2)
        Dim Emails As New HybridDictionary()
        Dim count = 1
        For Each email In q
            Emails.Add("email" + NCStr(count), email.Email)
            Emails.Add("label" + NCStr(count), email.Label)
            Emails.Add("id" + NCStr(count), email.ContactEmailID)
            count = count + 1
        Next
        txtPCEmail1.Text = Emails("email1")
        txtPCEmail1Label.Text = Emails("label1")
        lblEmail1ID.Text = Emails("id1")

        txtPCEmail2.Text = Emails("email2")
        txtPCEmail2Label.Text = Emails("label2")
        lblEmail2ID.Text = Emails("id2")
    End Sub

是的,有点像 hack,但我觉得我不应该仅仅为了将一些数据加载到字典或数组或其他东西中而制作特殊方法。

【问题讨论】:

    标签: vb.net arrays hashtable


    【解决方案1】:

    VB.NET 中的数组与 PHP 中的不同。您需要在尝试设置数组元素之前定义数组的大小。

    更好的是,考虑使用通用的List<T> 集合。

    【讨论】:

      【解决方案2】:

      是的,Phil 是对的,你没有指定数组的初始大小。

      按照他的建议使用通用列表,否则我会推荐

      “System.Collections.Specialized.StringCollection”类或“System.Collections.Specialized.HybridDictionary”类

      【讨论】:

      • 我喜欢 hybridDictionary...我将在帖子的编辑中发布代码
      【解决方案3】:

      先建哈希表,再建数组。

          Dim hash As New Hashtable()
          hash.Add("Header", shortModel)
          hash.Add("SpecInfo", specinfo)
          hash.Add("SerialNumber", serie & "-L")
          hash.Add("SerialNumber2", serie)
          hash.Add("seriel", serie & "-L")
          hash.Add("serie", serie)
          hash.Add("Product", modelBase)
          hash.Add("varBC", bc)
          hash.Add("box_id", boxId.Substring(4).ToString)
      
          Dim dt As DataTable = DbUtil.GetCursor("SFISM4.PKG_AGENCY.sp_get_print_param", {New OracleParameter("in_serie", "3CE5151ZW4")})
          For Each row As DataRow In dt.Rows
              hash.Add(row("NAME"), row("VALUE"))
          Next
      
      
          Dim mArray(hash.Count() - 1, 1) As String
          Dim i As Integer = 0
      
          For Each row As DictionaryEntry In hash
              mArray(i, 0) = row.Key.ToString()
              mArray(i, 1) = row.Value.ToString()
              i = i + 1
          Next
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        相关资源
        最近更新 更多