1

我有两个清单:

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 值,但不认为这是正确的方法。

4

1 回答 1

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);
}

我使用了 a TupleItem1来自的字母也是,list1并且Item2是 中的对应项目list2。当然,您可以使用匿名类型并给它一个更有意义的名称。

更新:我刚刚注意到你用 C#-3.0 标记了这个问题。在这种情况下,请使用以下解决方案。ZipTuple在 .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);
}
于 2013-10-07T16:04:12.770 回答