Как перебрать два списка одновременно? - PullRequest
0 голосов
/ 12 апреля 2011

Я упоминал следующий вопрос по адресу: Использование цикла foreach для перебора двух списков .У меня такой вопрос относительно выбранного ответа: может ли o.DoSomething быть сравнением?Как в:

For Each a in ListA.Concat(ListB)
    If(a from ListA=a from ListB) Then
        Do Something here
    End If
Next

Как вы уже догадались, я использую VB.Net и хотел бы знать, как я могу сделать то, что я показал здесь.Это было бы в основном, чтобы перебрать объединенный список отдельно / независимо.Спасибо!

Ответы [ 4 ]

4 голосов
/ 12 апреля 2011

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

    Dim joinedLists = From item1 In list1 _
                    Join item2 In list2 _
                    On item1.Bar Equals item2.Bar _
                    Select New With {item1, item2}

    For Each pair In joinedLists
        'Do work on combined item here'
        'pair.item1'
        'pair.item2'
    Next

Другие ответы рекомендуют Zip. Это просто функция, которая принимает две последовательности и выдает один результат, очень похожий на соединение, но она предназначена для работы в методе FIFO над обоими списками. Если вам нужны соединения, основанные на равенстве, Join - это специально созданный инструмент для этой работы.

1 голос
/ 12 апреля 2011

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

  Dim listA As List(Of A)
            Dim listb As List(Of B)

            listA.Zip(listb, Function(a, b) a.property1 = b.property1).ForEach(AddressOf Print)   


Shared Sub Print(ByVal s As A)
    Console.WriteLine(s.Property1)
End Sub
0 голосов
/ 12 апреля 2011

По решению было бы иметь словарь с элементами из второго списка, затем перебрать ваш первый список и извлечь соответствующий элемент во втором, используя словарь.Вот пример, если вы хотите сравнить элементы со свойством ID:

Dim DictB = ListB.ToDictionary(Function(x) x.ID)
For each itemA in ListA
    If DictB.ContainsKey(itemA.ID)
        'Item is in both lists
        Dim itemB = DictB(itemA.ID)
        'Do something here
    End If
Next
0 голосов
/ 12 апреля 2011

В .Net 4 вы можете использовать Zip . Адаптировано из моего ответа на этот вопрос от фаната Python, специально запрашивающего кортежи - вы можете удалить кортежи, если хотите.

Sub Main()
    Dim arr1() As String = {"a", "b", "c"} '' will also work with Lists
    Dim arr2() As String = {"1", "2", "3"}
    For Each t In TupleSequence(arr1, arr2)
        If t.Item1 = t.Item2 Then
          '' Do something
        End If
    Next
    Console.ReadLine()
End Sub
Function TupleSequence(Of T1, T2)(
    ByVal seq1 As IEnumerable(Of T1),
    ByVal seq2 As IEnumerable(Of T2)
    ) As IEnumerable(Of Tuple(Of T1, T2))
    Return Enumerable.Zip(seq1, seq2, 
      Function(s1, s2) Tuple.Create(s1, s2)
    )
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...