我有两个清单:
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值,但不要认为这是正确的方法。
答案 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
的字母,Item2
是list2
中的相应项目。当然,您可以使用匿名类型,而不是给它一个更有意义的名称。
更新:我刚注意到您使用C#-3.0标记了问题。在这种情况下,请使用以下解决方案。 .NET 4.0中引入了Zip
和Tuple
。下面的解决方案使用{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);
}