查找两个列表的匹配元素的索引

时间:2021-02-16 21:56:38

标签: vb.net list loops for-loop indices

vb.NET

我有两个列表(listA 和 listB),并且想要返回一个新列表(listC),其中包含与 listA 相比时 listB 的匹配元素索引。

所以,假设:listA = 3,4,5 和 listB = 1,2,3,4,5,6,7。我希望 listC 返回 2,3,4,因为它们是 listB 中匹配项的索引。

下面的代码将返回listC中listA和listB的匹配值。

Dim commonlist = listA.Intersect(listB).ToList()
For each common As String In commonlist
listC.Add(common)
Console.WriteLine(common)
Next common

如何将索引返回到 listC 或与此相关的新 listD?

1 个答案:

答案 0 :(得分:2)

Dim listC = listA.Select(Function(itemA) listB.IndexOf(itemA)).ToList()

如果您不熟悉 LINQ,Select 方法使用一个函数将列表中的项目映射到新列表。该映射函数的作用完全取决于您。它通常从项目中获取单个属性值,但在您的情况下,它正在获取另一个列表中项目的索引。

Select 返回一个 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