2010-04-14 3 views
0

Как я могу получить этот код в цикле?Visual Basic .NET Help

contact.first_name = list.Item(0) 
contact.middle_name = list.Item(1) 
contact.last_name = list.Item(2) 
contact.age = list.Item(3) 
contact.mobile_phone = list.Item(4) 
contact.home_phone = list.Item(5) 
contact.work_phone = list.Item(6) 
contact.home_street = list.Item(7) 
contact.home_city = list.Item(8) 
contact.home_state = list.Item(9) 
contact.home_zip = list.Item(10) 
contact.work_street = list.Item(11) 
contact.work_city = list.Item(12) 
contact.work_state = list.Item(13) 
contact.work_zip = list.Item(14) 
+1

Что именно вы хотите сделать? Непонятно, как вы хотите это сделать в цикле ... –

+1

Нет ничего плохого в отображении из нетипизированного списка в типизированный объект с кодом, который у вас уже есть. – Juliet

ответ

3

Вы не можете. Даже если вы использовали что-то вроде отражения, чтобы перечислить поля в контакте и назначить их таким образом, поскольку для этих членов нет неотъемлемого упорядочения, вы все равно не сможете выполнить цикл.

0

Предполагаю, что вы хотите петли list.Item. Вы можете это сделать, но в итоге у вас будет больше кода, чем у вас уже есть.

Например

For i As Integer = 0 To list.Item.Count - 1 
    Select Case i 
    Case 1 
     contact.middle_name = list.Item(i) 
    Case 2 
     contact.last_name = list.Item(i) 
    Case 3 
     contact.age = list.Item(i) 
    ... 
    End Select 
Next 

Как вы можете видеть это, вероятно, не стоит делать.

1

Во-первых, вам понадобится способ связать индекс с именем свойства. Возможно, лучший способ сделать это, чтобы создать список пар, которые хранят имя свойства и индекс:

Class Info 
    Public Property Name As String 
    Public Property Index As Integer 
End Class 

Затем, вам нужно создать список с элементами, которые представляют ассоциации:

Dim associations = { 
    New Info With { .Name = "first_name", .Index = 0 }, _ 
    New Info With { .Name = "second_name", .Index = 1}, ... } 

Теперь вы можете использовать простую For петлю и Reflection задать свойства:

Dim contType = contact.GetType() 
Dim empty As Object(0) 
For Each assoc In associations 
    contType.GetProperty(assoc.Name) _ 
      .SetValue(contact, list.Item(assoc.Index), empty) 
Next 

Я не эксперт VB, и я не пытался код, но что-то вдоль этих линий должно сработать. В любом случае, это действительно зависит от сценария - в некоторых случаях нет лучшего способа, чем то, что вы используете в настоящее время.

0

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

Public Sub FillContact(ByVal contact As Contact, values As IList(Of Object), 
         startingIndex As Integer) 
    'error checking here, such as ensuring you have a contact and value 
    'list and that startingIndex + number of properties < values.Count 

    contact.first_name = values(startingIndex) 
    contact.middle_name = values(startingIndex + 1) 
    '... 
    contact.work_state = value(startingIndex + 13) 
    contact.work_zip = value(startingIndex + 14) 
End Sub 

Тогда вы можете вызвать эту функцию в цикле, что-то вроде

Dim contacts As New List(Of Contact) 
'load the values 
Dim values() As Object = GetValues() 
For i = 0 To values.Length Step NumberOfProperties 
    Dim nextContact As New Contact() 
    FillContact(nextContact, values, i) 
    contacts.Add(nextContact) 
Next 
0

мне удалось заставить его работать в операторе цикла.

For x As Integer = 1 To list.Count/15 
     Dim contact As New Contact 
     my_contacts.Add(contact) 
    Next 

    Dim i As Integer = 0 

    For Each contact In my_contacts 
     With contact 
      .first_name = list.Item(i) 
      i += 1 
      .middle_name = list.Item(i) 
      i += 1 
      .last_name = list.Item(i) 
      i += 1 
      .age = list.Item(i) 
      i += 1 
      .mobile_phone = list.Item(i) 
      i += 1 
      .home_phone = list.Item(i) 
      i += 1 
      .work_phone = list.Item(i) 
      i += 1 
      .home_street = list.Item(i) 
      i += 1 
      .home_city = list.Item(i) 
      i += 1 
      .home_state = list.Item(i) 
      i += 1 
      .home_zip = list.Item(i) 
      i += 1 
      .work_street = list.Item(i) 
      i += 1 
      .work_city = list.Item(i) 
      i += 1 
      .work_state = list.Item(i) 
      i += 1 
      .work_zip = list.Item(i) 
      i += 1 
     End With 
    Next 
0

Простой, используйте цикл ForEach для итерации через контактные элементы. Я предполагаю, что «контакт» - это класс со всеми перечисленными членами, являющимися публичными.

Далее используйте переменную счетчика (i), чтобы перейти от 0 до (list.Items.Count - 1). Инициализируйте эту переменную счетчика вне цикла ForEach.

Затем назначьте первый элемент списка (при i = 0) первому входящему контакту. После назначения, increment i (i + = 1), а затем закройте цикл.

Теперь я буду автоматически увеличивать каждый раз при запуске цикла и назначать необходимые данные контактному элементу.

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