2011-11-29 70 views
14

我有两个IEnumerable<double> s,我想建立一个IEnumerableTuple<int, double, double>从。 Item1Tuple应该是该项目的索引,Item2是第一个集合中第index个位置的值,Item3是第二个集合中第index个位置的值。这在Linq中可以轻松完成吗?我可以使用Linq从IEnumerables构建元组吗?

E.g.

var first = new List<double>() { 10.0, 20.0, 30.0 }; 
var second = new List<double>() { 1.0, 2.0, 3.0 }; 
var result = TupleBuild(first, second); 
// result = {(0, 10.0, 1.0), (1, 20.0, 2.0), (2, 30.0, 3.0)} 

其中:

IEnumerable<Tuple<int, double, double>> TupleBuild(IEnumerable<double> first, IEnumerable<double> second) 
{ 
    // does some funky Linq 
} 

我知道我可以写一些这方面的手写代码,但我宁愿不另起炉灶如果Linq的有这个覆盖。

回答

22

如何与Zip运营商和Select重载提供了元素的索引:

return first.Zip(second, Tuple.Create) 
      .Select((twoTuple, index) 
         => Tuple.Create(index, twoTuple.Item1, twoTuple.Item2)); 

顺便说一句,你不妨再使该方法一般:

IEnumerable<Tuple<int, TFirst, TSecond>> TupleBuild<TFirst, TSecond> 
(IEnumerable<TFirst> first, IEnumerable<TSecond> second) { ... } 
+0

优秀, 谢谢!希望我可以给你一个额外的投票给我介绍给Zip扩展:) –

+0

我希望我可以upvote两次Zip和重载选择。 – drdwilcox

相关问题