[editar]: aclarar; esto es útil en el LINQ genérico/IEnumerable<T>
contexto, en el que no se puede utilizar un indexador, debido a: que no existe en un enumerable, yb: no se puede garantizar que se pueden leer los datos de más de una vez. Dado que OP menciona lambdas, ocurre que LINQ podría no estar muy lejos (y sí, me doy cuenta de que LINQ y lambdas no son exactamente lo mismo).
Suena como que necesita el Zip
falta operador; puede que la simulan:
static void Main()
{
int[] left = { 1, 2, 3, 4, 5 };
string[] right = { "abc", "def", "ghi", "jkl", "mno" };
// using KeyValuePair<,> approach
foreach (var item in left.Zip(right))
{
Console.WriteLine("{0}/{1}", item.Key, item.Value);
}
// using projection approach
foreach (string item in left.Zip(right,
(x,y) => string.Format("{0}/{1}", x, y)))
{
Console.WriteLine(item);
}
}
// library code; written once and stuffed away in a util assembly...
// returns each pais as a KeyValuePair<,>
static IEnumerable<KeyValuePair<TLeft,TRight>> Zip<TLeft, TRight>(
this IEnumerable<TLeft> left, IEnumerable<TRight> right)
{
return Zip(left, right, (x, y) => new KeyValuePair<TLeft, TRight>(x, y));
}
// accepts a projection from the caller for each pair
static IEnumerable<TResult> Zip<TLeft, TRight, TResult>(
this IEnumerable<TLeft> left, IEnumerable<TRight> right,
Func<TLeft, TRight, TResult> selector)
{
using(IEnumerator<TLeft> leftE = left.GetEnumerator())
using (IEnumerator<TRight> rightE = right.GetEnumerator())
{
while (leftE.MoveNext() && rightE.MoveNext())
{
yield return selector(leftE.Current, rightE.Current);
}
}
}
¿Desea concatenar los elementos correspondientes de cada lista? ¿O quieres el producto cartesiano de las listas? –
@Vincent: ya que él menciona la misma longitud, supongo que la primera. –
Ninguno. Pero esto no debería importar, ¿verdad? – Graviton