2011-11-29 14 views
14

Tengo dos IEnumerable<double> s, que quiero construir un IEnumerable de Tuple<int, double, double> de. Item1 del Tuple debe ser el índice del artículo, Item2 el valor en el lugar del índice-th en la primera colección, y Item3 el valor en el lugar del índice-th en la segunda colección. ¿Es esto algo que se puede hacer fácilmente en Linq?¿Puedo construir Tuples a partir de IEnumerables usando Linq?

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

donde:

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

Soy consciente de que podría escribir algo de código para esta escritura a mano, pero yo prefiero no reinventar la rueda si ha LINQ esta cubierta.

Respuesta

22

¿Qué tal con el operador Zip y la sobrecarga de Select que proporciona el índice del elemento:

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

Por cierto, que también podría entonces hacer que el método genérico:

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

Excelente , ¡Gracias! Desearía poder darte un voto extra por haberme presentado la extensión Zip :) –

+0

Y desearía haber votado dos veces para Zip y para la selección sobrecargada. – drdwilcox

Cuestiones relacionadas