获取第一个列表的索引并在另一个列表中使用它

时间:2013-10-07 15:38:54

标签: linq c#-3.0

我有两个清单:

List1 has values like: "A, A, A, A, B, B, B, B, C, C, C, C, C... so on
List2 has values like: "0, 1, 2, 2, 1.1, 1.2, 1.3, 4, 4, 4, 4.... so on

我想得到List1的索引,其值为B,并在List2中找到相应的值。 我正在做的是获取List1的开始和结束索引,其中值为B.比通过list2循环索引这些索引并获取值。这似乎是太多的工作和很多开销。使用linq有更好的方法吗?

我使用了这个:var list1Values = list1.FindAll(x => x.Contains("B"));这给了我来自B的值我被困在这之后就好像我怎么能在这之后从list2得到相应的值?因为findAll甚至不给索引。一种想法是循环遍历list1Values的索引并获取list2值,但不要认为这是正确的方法。

1 个答案:

答案 0 :(得分:1)

如果两个列表的长度相同,您可以使用Zip配对两个序列中的相应项:

var target = "B";
var result = list1.Zip(list2, (x,y) => Tuple.Create(x,y))
                  .Where(o => o.Item1 == target);

foreach(var item in result)
{
    Console.WriteLine(item.Item2);
}

我使用的是Tuple,因此Item1是来自list1的字母,Item2list2中的相应项目。当然,您可以使用匿名类型,而不是给它一个更有意义的名称。

更新:我刚注意到您使用C#-3.0标记了问题。在这种情况下,请使用以下解决方案。 .NET 4.0中引入了ZipTuple。下面的解决方案使用{3.5}中提供的Select方法。两种解决方案都使用LINQ,因此您需要添加命名空间:using System.Linq;

另一个解决方案是使用重载Select method来获取目标字母的索引,然后根据这些索引从第二个列表中获取项目。

var target = "B";
var targetIndices = list1.Select((o, i) => new { Value = o, Index = i })
                         .Where(o => o.Value == target);
var query = targetIndices.Select(o => list2[o.Index]);

foreach(var item in query)
{
    Console.WriteLine(item);
}