我有两个清单:
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
我想获取具有说B的值的List1的索引,并在List2中找到对应的值。我正在做的是获取List1的开始和结束索引,其中值是B。而不是遍历list2的那些索引并获取值。这似乎是太多的工作和大量的开销。有没有更好的方法来使用linq做到这一点?
我用了这个:varlist1Values = list1.FindAll(x => x.Contains("B"));
这给了我B的值,这之后我被困住了,就像我如何从此之后得到list2的对应值?作为findAll甚至不给索引。一种想法是循环遍历list1Values的索引并获取list2值,但不认为这是正确的方法。
如果两个列表的长度相同,则可以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标记了这个问题。在这种情况下,请使用以下解决方案。Zip
并Tuple
在.NET 4.0中引入。下面的解决方案使用Select
.NET 3.5中可用的方法。两种解决方案都使用LINQ,因此您需要添加名称空间:using System.Linq;
另一种解决方案是使用重载Select
方法来获取目标字母的索引,然后基于这些索引从第二个列表中获取项目。
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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句