查找两个列表的匹配元素的索引
Find the indices of matching elements of two lists
vb.NET
我有两个列表(listA 和 listB),想要 return 一个新列表 (listC),其中包含 listB 与 listA 相比的匹配元素的索引。
所以,假设:listA = 3,4,5 和 listB = 1,2,3,4,5,6,7。我希望 listC 为 return 2,3,4,因为这些是 listB 中匹配项的索引。
下面的代码会returnlistC中listA和listB的匹配值
Dim commonlist = listA.Intersect(listB).ToList()
For each common As String In commonlist
listC.Add(common)
Console.WriteLine(common)
Next common
如何return listC 的索引,或者一个新的 listD?
Dim listC = listA.Select(Function(itemA) listB.IndexOf(itemA)).ToList()
如果您不熟悉 LINQ,Select
方法采用一个函数将列表中的项目映射到新列表。映射函数的作用完全取决于您。它通常从项目中获取单个 属性 值,但在您的情况下,它获取另一个列表中项目的索引。
Select
returns 一个 IEnumerable(Of T)
如果你打算做的只是 运行 一个 For Each
循环,这就是你所需要的,但是你可以调用 ToList
创建一个 List(Of T)
如果这是你想要的。
编辑:
我想我可能稍微误解了这个问题。我将保留原来的答案,因为我所做的基本上是问题中要求的 listD
,但我将添加有关获取项目和索引的信息。
这是一个选项:
Dim listA As New List(Of Integer) From {1, 2, 3, 9}
Dim listB As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
Dim listC = listA.Select(Function(a) Tuple.Create(a, listB.IndexOf(a))).
Where(Function(ta) ta.Item2 <> -1).
ToList()
For Each ta In listC
Console.WriteLine("Value: {0}; Index: {1}", ta.Item1, ta.Item2)
Next
该代码将创建一个 Tuples
列表,其中每个列表都包含 listA
中的一个值以及该值在 listB
中的索引。不在两个列表中的那些值被排除在外。
如果你想要比 Tuple
更好一点的东西,那么你可以创建一个 Dictionary
:
Dim listA As New List(Of Integer) From {1, 2, 3, 9}
Dim listB As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
Dim dictionaryC = listA.Select(Function(a) Tuple.Create(a, listB.IndexOf(a))).
Where(Function(ta) ta.Item2 <> -1).
ToDictionary(Function(ta) ta.Item1,
Function(ta) ta.Item2)
For Each key In dictionaryC.Keys
Console.WriteLine("Value: {0}; Index: {1}", key, dictionaryC(key))
Next
如果您特别想要两个单独的列表,那么您可以这样做:
Dim listA As New List(Of Integer) From {1, 2, 3, 9}
Dim listB As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
Dim listC = listA.Intersect(listB).ToList()
Dim listD = listC.Select(Function(c) listB.IndexOf(c)).ToList()
For i = 0 To listC.Count - 1
Console.WriteLine("Value: {0}; Index: {1}", listC(i), listD(i))
Next
vb.NET
我有两个列表(listA 和 listB),想要 return 一个新列表 (listC),其中包含 listB 与 listA 相比的匹配元素的索引。
所以,假设:listA = 3,4,5 和 listB = 1,2,3,4,5,6,7。我希望 listC 为 return 2,3,4,因为这些是 listB 中匹配项的索引。
下面的代码会returnlistC中listA和listB的匹配值
Dim commonlist = listA.Intersect(listB).ToList()
For each common As String In commonlist
listC.Add(common)
Console.WriteLine(common)
Next common
如何return listC 的索引,或者一个新的 listD?
Dim listC = listA.Select(Function(itemA) listB.IndexOf(itemA)).ToList()
如果您不熟悉 LINQ,Select
方法采用一个函数将列表中的项目映射到新列表。映射函数的作用完全取决于您。它通常从项目中获取单个 属性 值,但在您的情况下,它获取另一个列表中项目的索引。
Select
returns 一个 IEnumerable(Of T)
如果你打算做的只是 运行 一个 For Each
循环,这就是你所需要的,但是你可以调用 ToList
创建一个 List(Of T)
如果这是你想要的。
编辑:
我想我可能稍微误解了这个问题。我将保留原来的答案,因为我所做的基本上是问题中要求的 listD
,但我将添加有关获取项目和索引的信息。
这是一个选项:
Dim listA As New List(Of Integer) From {1, 2, 3, 9}
Dim listB As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
Dim listC = listA.Select(Function(a) Tuple.Create(a, listB.IndexOf(a))).
Where(Function(ta) ta.Item2 <> -1).
ToList()
For Each ta In listC
Console.WriteLine("Value: {0}; Index: {1}", ta.Item1, ta.Item2)
Next
该代码将创建一个 Tuples
列表,其中每个列表都包含 listA
中的一个值以及该值在 listB
中的索引。不在两个列表中的那些值被排除在外。
如果你想要比 Tuple
更好一点的东西,那么你可以创建一个 Dictionary
:
Dim listA As New List(Of Integer) From {1, 2, 3, 9}
Dim listB As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
Dim dictionaryC = listA.Select(Function(a) Tuple.Create(a, listB.IndexOf(a))).
Where(Function(ta) ta.Item2 <> -1).
ToDictionary(Function(ta) ta.Item1,
Function(ta) ta.Item2)
For Each key In dictionaryC.Keys
Console.WriteLine("Value: {0}; Index: {1}", key, dictionaryC(key))
Next
如果您特别想要两个单独的列表,那么您可以这样做:
Dim listA As New List(Of Integer) From {1, 2, 3, 9}
Dim listB As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
Dim listC = listA.Intersect(listB).ToList()
Dim listD = listC.Select(Function(c) listB.IndexOf(c)).ToList()
For i = 0 To listC.Count - 1
Console.WriteLine("Value: {0}; Index: {1}", listC(i), listD(i))
Next