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

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