试图将一些PHP数组代码转换为VB.NET

时间:2012-05-16 12:44:50

标签: php vb.net arrays

修改

好的,所以经过一段时间的努力,我想出了一个有效的解决方案,它比我原先想象的更干净。谢谢你的帮助。这是代码。

Function Program_Search() As String()
    'An ArrayList of Objects containing strings for each row.
    'So the result is ArrayList(objRow1(strID, strPrograms), objRow2(strID, strPrograms).. etc)
    Dim program_results As ArrayList = Get_Results("SELECT ID, Programs FROM tbMetrics ORDER BY ID ASC", strConnectionString)

    'Initialize the list of programs. This will contian the tbMetrics Programs that match the selected Program name.
    Dim programs As ArrayList = New ArrayList

    'Loop through each row selected
    For Each row As Object In program_results
        'Not currently used.
        Dim strID As String = row(0).ToString

        'An integer representation of a binary number. Each digit represents a different program being checked.
        Dim intPrograms As Integer = CInt(row(1).ToString)

        'Convert number to binary string (reversed)
        Dim strReversed As String = StrReverse(Convert.ToString(intPrograms, 2))

        'Loop through each of the programs in the drop down box which should contain all of the possible choices in order.
        For index As Integer = 0 To ddlPrograms.Items.Count - 1
            'A bit of an ugly if state that checks for a 1 in the binary position for the selected program.
            'Then if it's selected, it checks that the program matches the one selected by the user.
            'Finally, it makes sure it doesn't add the same number to the array.
            If (strReversed.Length - 1) >= index _
                And strReversed(index) = "1" _
                And ddlPrograms.SelectedValue.ToString = ddlPrograms.Items(index).Value.ToString _
                And programs.Contains(intPrograms) = False Then

                'If it passes all of the above checks, then finally add the program integer to the arraylist.
                programs.Add(intPrograms)
            End If
        Next index
    Next row

    'Return the list of programs as an array, to be used with SQL IN().
    Return programs.ToArray
End Function

结束编辑

原版以下

好的,所以我是一名PHP程序员,试图学习一些VB.NET。数组在VB.NET中让我很困惑,所以我用PHP的方式编写了一些PHP代码示例代码。如果someoen可以告诉我它在VB.NET中运行的正确方法,我将不胜感激。

<?php

function get_result() {
    $result = query("SELECT id, value FROM test_table");
    /*Returned as:
    array(
      array("id1", "value1"), 
      array("id2", "value2")...etc.
    )*/

    $haystack_top = array();

    foreach ($result as $row) {
        $id = $row[0]; //Not used currently
        $value = $row[1];

        for($i=0; $i <= $value; $i++) {
            if (check_value($i)) {
                $haystack_value = get_new_value($i);
                $haystack_top[$value][] = $haystack_value;
            }
        }
    }

    $needle = get_needle();

    $result = array();

    foreach ($haystack_top as $value=>$haystack) {
        if (in_array($needle, $haystack)) {
            $result[] = $value;
        }
    }

    return array_unique($result);
}

?>

这是我在Vb.NET中所做的一个较旧的,未完成的副本它不是我实际需要的形式,因为我在构建PHP示例时改变了逻辑应该如何工作,但它显示了我运行的混乱在VB.NET中使用Arrays。

Function Program_Search() As String()
    Dim program_results As Object = Get_Results("SELECT ID, Programs FROM tbMetrics ORDER BY ID ASC", strConnectionString)

    'Create an array of strings to fill with potential field results.
    Dim fields As List(Of String) = New List(Of String)()

    For Each row As Object In program_results
        Dim strID As String = row(0).ToString
        Dim strPrograms As String = row(1).ToString

        Dim intPrograms As Integer = CInt(strPrograms)

        'Convert number to binary string (reversed)
        Dim strReversed As String = StrReverse(Convert.ToString(intPrograms, 2))

        For index As Integer = 0 To ddlPrograms.Items.Count - 1
            If (strReversed.Length - 1) >= index Then
                If strReversed(index) = "1" Then
                    fields.Add(ddlPrograms.Items(index).Value.ToString)
                End If
            End If
        Next index
    Next row

    Dim programs As String() = fields.ToArray

    Dim results As String()

    If programs.Contains(ddlPrograms.SelectedValue.ToString) Then

    End If

    Return programs
End Function

因为有人对Get_Results函数感到好奇,所以这里是代码。

'Runs the passed query and returns each row as an object within an ArrayList
    Function Get_Results(ByVal query As String, ByVal ConnectionStringName As String) As ArrayList
        Dim sqlComm As Data.SqlClient.SqlCommand = Get_Connection(query, ConnectionStringName)

        'Open that connection
        sqlComm.Connection.Open()

        'Execute the query and store all of the results into the SqlDataReader.
        Dim sqlRead As Data.SqlClient.SqlDataReader = sqlComm.ExecuteReader()

        Dim result As ArrayList = New ArrayList

        'Read each row one by one.
        While sqlRead.Read()
            'Create an object of the size needed.
            Dim row(sqlRead.FieldCount - 1) As Object

            'Fill the row object with the values.
            sqlRead.GetValues(row)

            'Add the result object to the array.
            result.Add(row)
        End While

        'Close all open connections to the database.
        sqlRead.Close()
        sqlComm.Connection.Close()

        Return result
    End Function

1 个答案:

答案 0 :(得分:2)

基于这个评论“...说实话,我只是在如何在VB.NET中正确创建动态多维数组,以及如何像在我的PHP示例中那样使用它们时感到困惑......” ,我会提供我的答案。

你的专栏:

 Dim fields As List(Of String) = New List(Of String)()

创建一个列表,而不是一个数组。列表更容易使用,因为您可以添加项目而无需调整大小。如果您想要这样做而不是2D数组,则可以创建List(Of MyObject)。只需创建一个包含两个字段的类,并列出这些对象。你的课程大约有4行代码。

要创建一个2D阵列,就像你正在做的那样,你应该在这里找到你需要的一切。

http://msdn.microsoft.com/en-us/library/d2de1t93(v=vs.90).aspx

不幸的是,要创建动态2D数组,没有简洁的方法可以做到这一点。如果我没有弄错的话,你必须将元素复制到另一个数组。我知道,这很蹩脚。这就是我喜欢List(Of MyObject)方法的原因,因为您在创建新项目时只能MyList.Add(myObject)

如果您需要稍后迭代这些项以检索值,您可以使用for循环并按原样访问它们:

MyList(i).MyObjectPropertyName1
MyList(i).MyObjectPropertyName2
VB.NET可能是更易读的语言之一,但是对于任何语言,你必须习惯它。我看着你的PHP,我的头几乎爆炸了。我敢肯定,如果我花了几个小时学习语法,那就更有意义了。

相关问题