如何同时循环两个列表?
我在以下问题处提及以下问题:Using foreach loop to iterate through two lists。我的问题是,关于选择的答案: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,想知道我怎么能做我在这里显示的。这基本上是分开/独立地遍历连接列表。谢谢!
你的问题表明你需要一个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这是正确的,只要你想要测试每个可能的组合是否相等,而不仅仅是两个列表中匹配索引位置的组合。我不能决定从被通缉的问题出发“{0,1,2}”和“{2,0,1}”是否应报告没有匹配或三个匹配?你的回答报告三个匹配0 = 0 1 = 1和2 = 2。 @Akshay,你想要哪个? – MarkJ 2011-04-12 16:31:59
我的问题is-it-possible-to-iterate-over-two-ienumerable-objects-at-the-same-time的答案可以帮助
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
谢谢!我现在每个使用嵌套,但它没有工作得太好.. :(将尝试邮编,看看.. – CodingInCircles 2011-04-12 09:19:11
谢谢!:)将尝试这一点,让你知道。谢谢! – CodingInCircles 2011-04-12 13:36:46
因此,这将返回一个IEnumerable的布尔值,指示每一对是否相等?这个问题的“做些什么”部分呢?你将如何“在这里做点什么”? – MarkJ 2011-04-12 16:28:37
在.NET 4中,你可以使用Zip。根据我对来自Python迷的this question的回答进行改编,具体请求tuples - 如果您愿意,可以删除元组。
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
我试过Zip,但是如何指定相等条件?如果可以给我语法,我很乐意尝试那么,我自己尝试了一些东西,没有工作,有什么帮助吗? – CodingInCircles 2011-04-12 11:55:56
@Akshay不是我的回答吗?如果t.Item1 = t.Item2然后做一些事情[与t.Item1或t.Item2一起,推测' – MarkJ 2011-04-12 16:26:44
在解决方案是必须与从第二个列表,然后循环项目的字典,通过你的第一个列表,并在第二个取回相应的项目,使用字典。这里有一个例子,假设你想用一个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
@Dean:我没有什么可以使用的。这太复杂了,我现在正在使用.Net 4。 Zip会起作用,但我如何设置那里的状况?另外,我正在使用列表,而不是IEnums。你能让我知道这样做的正确方法吗? – CodingInCircles 2011-04-12 09:33:10
请记住,要在IEnumerator(Of ListA)上执行操作,您只需调用ListA.GetEnumerator()(显然这两个列表)。我添加了一个编辑来说明如何使用Zip – Dean 2011-04-12 13:20:50
我很抱歉,但是我意识到我根本不需要这个。我以不同的方式解决了这个问题。非常感谢!在这个过程中学到了很多东西。 – CodingInCircles 2011-04-14 12:19:28