2012-05-16 2 views
0

EDITПопытка преобразовать код PHP массив в VB.NET

Итак, после работы через это на некоторое время, я придумал решение, которое работает, и чище, чем я первоначально придумал для этого. Спасибо за помощь, ребята! Вот код.

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 

END EDIT

ОРИГИНАЛ НИЖЕ

Хорошо, так что я PHP программист, пытаясь узнать некоторые VB.NET. Массивы сильно путают меня в VB.NET, поэтому я написал код примера в PHP так, как я знаю, как это сделать. Я был бы очень признателен, если бы кто-нибудь мог показать мне, как это работает в 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.

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 
+4

Что вы пытались и что не работает в том, что вы пробовали? В какой части всего кода вы испытываете проблемы с дублированием в VB?Это факт, что это 2D-массив, который вызывает у вас горе? –

+0

@SteveDog Я редактировал вопрос, чтобы показать, где я был на VB.NET-коде, прежде чем получить frusturated и написать код примера PHP, чтобы помочь мне работать с ним логически и точно знать, что мне нужно. – Ryan

+1

Что такое подпись метода Get_Results, который вы вызываете? –

ответ

2

Основываясь на этот комментарий»... честно говоря, я просто запутался, как правильно создавать динамические многомерные массивы в VB.NET, и как использовать их, как я в моем PHP пример ... », я предоставлю свой ответ.

Ваша линия:

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

создает список, а не массив. Списки немного проще в использовании, так как вы можете добавлять элементы без изменения размера. Вы можете сделать List(Of MyObject), если вы хотите сделать это вместо 2D-массива. Просто создайте класс с двумя полями и создайте список этих объектов. В вашем классе будет около 4 строк кода.

Чтобы создать 2D-массив, на что похоже, что вы делаете, вы должны найти все, что вам нужно здесь.

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

К сожалению, для создания динамического 2D массива, нет обтекаемого способа сделать это. Вы должны скопировать элементы в другой массив, если я не ошибаюсь. Я знаю, это довольно хромой. Вот почему мне нравится подход List(Of MyObject), в котором вы можете только MyList.Add(myObject) при создании нового элемента.

Если вам нужно перебирать пункты позже для получения значений, вы можете просто использовать для обратной связи и доступа к ним, как, например:

MyList(i).MyObjectPropertyName1 
MyList(i).MyObjectPropertyName2 

VB.NET, вероятно, один из наиболее читаемых языков , но с любым, вы должны привыкнуть к нему. Я посмотрел на ваш PHP, и моя голова чуть не взорвалась. Я уверен, что если бы я взял пару часов и выучил синтаксис, это сделало бы (более) смысл.

+0

Я как раз собирался объяснить разницу между списками (коллекциями) и массивами. Ты подтолкнул меня на это! Я собирался предложить создать класс для хранения данных, но он пытается создать метод, который может выполнять любой запрос и возвращать результаты. Я лично никогда этого не сделаю и предлагаю сделать отдельные методы для каждого запроса, как вы предлагаете. Однако, если ему это нужно, чтобы выполнить любой запрос, я бы предложил использовать DataTable или DataSet, а не 2D-массив. –

+0

@SteveDog все равно, что бы он ни делал с массивом, он может управлять списком. Может быть, нужно кое-что изменить здесь и там, но это звучит не так, как будто он слишком далеко от VB. Динамические строки SQL редко бывают хорошей идеей. = | – Yatrix

+1

Согласовано. Я редко использую массивы. Я использую List (Of) для большинства вещей, потому что с ним просто работать. –

Смежные вопросы