Skip to content

Latest commit

 

History

History
111 lines (84 loc) · 1.88 KB

Any.Zip.md

File metadata and controls

111 lines (84 loc) · 1.88 KB

Any.Zip

Iterate over several iterables in parallel, producing tuples with an item from each one.


Example:

var numbers = new[] { 1, 2, 3 };
var weeks = new[] { "Monday", "Tuesday", "Wednesday" };
var abbrWeeks = new[] { "Mon.", "Tues.", "Wed." };

foreach(var item in Any.Zip(numbers, weeks, abbrweeks))
{
    Console.WriteLine(item);
}

(1, Monday, Mon.)
(2, Tuesday, Tues.)
(3, Wednesday, Wed.)


Since each item is a ValueTuple, it can also be automatically deconstructed.

foreach (var (number, week, abbrWeek) in Any.Zip(numbers, weeks, abbrWeeks))
{
    Console.WriteLine($"({number}, {week}, {abbrWeek})");
}

(1, Monday, Mon.)
(2, Tuesday, Tues.)
(3, Wednesday, Wed.)


The Any.Zip method supports up to eight parameters, and nesting can be used if more parameters are required.

foreach (var (number, (week, abbrWeek)) in Any.Zip(numbers, Any.Zip(weeks, abbrWeeks)))
{
    Console.WriteLine($"({number}, {week}, {abbrWeek})");
}

Cases

Sum the elements of each column

var numbers = new[]
{
    new[] { 1, 2, 3 },
    new[] { 4, 5, 6 },
    new[] { 7, 8, 9 },
};

var zip = Any.Zip(numbers, col => col.Sum());
Console.WriteLine(
    $"[{string.Join(", ", zip)}]"
);

[12, 15, 18]


Matrix Transpose

void Main()
{
    var numbers = new[]
    {
        new[] { 1, 2, 3 },
        new[] { 4, 5, 6 },
        new[] { 7, 8, 9 },
    };
    
    PrintMatrix(numbers);
    PrintMatrix(Any.Zip(numbers));
}

void PrintMatrix(IEnumerable<IEnumerable<int>> matrix)
{
    Console.WriteLine(
        string.Join(Environment.NewLine,
        (
            matrix.Select(row => $"[{string.Join(", ", row)}]")
        ))
    );
    Console.WriteLine();
}

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]