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?
答案 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