I'm trying to loop five list by merging them.
I know that this works fine
var zipped = letters.Zip(numbers, Tuple.Create);
foreach (var tuple in zipped)
{
Console.WriteLine(tuple.Item1);
Console.WriteLine(tuple.Item2);
}
but i'm wondering I can use that same method, but with more list included.
Let's say I have the list numbers, letters, words, pictures and songs
How whould that loop look like then?

The simplest approach would probably be to reimplement Zip yourself multiple times, e.g.
public static IEnumerable<Tuple<T1, T2>> ZipTuple<T1, T2>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2)
public static IEnumerable<Tuple<T1, T2, T3>> ZipTuple<T1, T2, T3>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2,
IEnumerable<T3> source3)
public static IEnumerable<Tuple<T1, T2, T3, T4>> ZipTuple<T1, T2, T3, T4>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2,
IEnumerable<T3> source3,
IEnumerable<T3> source4)
The implementation will be tedious, but it's fairly simple to do.
Then you can just call:
var query = numbers.ZipTuple(letters, words, pictures, songs);
I'd probably implement each independently from scratch, but you could do it with one call to the "previous" ZipTuple and one call to Zip in each case, e.g.
public static IEnumerable<Tuple<T1, T2, T3>> ZipTuple<T1, T2, T3>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2,
IEnumerable<T3> source3)
{
return source1
.ZipTuple(source2)
.Zip(source3, (t1, extra) => Tuple.Create(t1.Item1, t1.Item2, extra));
}
public static IEnumerable<Tuple<T1, T2, T3, T4>> ZipTuple<T1, T2, T3, T4>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2,
IEnumerable<T3> source3,
IEnumerable<T4> source4)
{
return source1
.ZipTuple(source2, source3)
.Zip(source4, (t1, extra) => Tuple.Create(t1.Item1, t1.Item2, t1.Item3, extra));
}
The direct version would look something like this:
public static IEnumerable<Tuple<T1, T2, T3, T4>> ZipTuple<T1, T2, T3, T4>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2,
IEnumerable<T3> source3,
IEnumerable<T4> source4)
{
// TODO: Extract a separate public method from the implementation
// method and perform eager validation for nullity
using (var iterator1 = source1.GetEnumerator())
using (var iterator2 = source2.GetEnumerator())
using (var iterator3 = source3.GetEnumerator())
using (var iterator4 = source4.GetEnumerator())
{
while (iterator1.MoveNext() && iterator2.MoveNext() &&
iterator3.MoveNext() && iterator4.MoveNext())
{
yield return Tuple.Create(
iterator1.Current,
iterator2.Current,
iterator3.Current,
iterator4.Current);
}
}
}
See more on this question at Stackoverflow