How to combine more than two generic lists in C# Zip?

Related searches

I have three (it's possible to have more than 3-4 generic list, but in this example let 3) generic lists.

List<string> list1

List<string> list2

List<string> list3

all lists have same number of elements (same counts).

I used that for combining two lists with ZIP :

var result = list1.Zip(list2, (a, b) => new {
  test1 = f,
  test2 = b
}

I used that for foreach statement, to avoid foreach each List, like

foreach(var item in result){
Console.WriteLine(item.test1 + " " + item.test2);
}

How to use simmilary with Zip for three lists ?

Thanks

EDIT:

I want like:

List<string> list1 = new List<string>{"test", "otherTest"};

List<string> list2 = new List<string>{"item", "otherItem"};

List<string> list3 = new List<string>{"value", "otherValue"};

after ZIP (I don't know method), I want to result (in VS2010 debug mode)

[0] { a = {"test"},
      b = {"item"},
      c = {"value"}
    }   

[1] { a = {"otherTest"},
      b = {"otherItem"},
      c = {"otherValue"}
    }  

How to do that ?

The most obvious way for me would be to use Zip twice.

For example,

var results = l1.Zip(l2, (x, y) => x + y).Zip(l3, (x, y) => x + y);

would combine (add) the elements of three List<int> objects.

Update:

You could define a new extension method that acts like a Zip with three IEnumerables, like so:

public static class MyFunkyExtensions
{
    public static IEnumerable<TResult> ZipThree<T1, T2, T3, TResult>(
        this IEnumerable<T1> source,
        IEnumerable<T2> second,
        IEnumerable<T3> third,
        Func<T1, T2, T3, TResult> func)
    {
        using (var e1 = source.GetEnumerator())
        using (var e2 = second.GetEnumerator())
        using (var e3 = third.GetEnumerator())
        {
            while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext())
                yield return func(e1.Current, e2.Current, e3.Current);
        }
    }
}

The usage (in the same context as above) now becomes:

var results = l1.ZipThree(l2, l3, (x, y, z) => x + y + z);

Similarly, you three lists can now be combined with:

var results = list1.ZipThree(list2, list3, (a, b, c) => new { a, b, c });

How to combine more than two generic lists in C# Zip?, I was wondering if any LINQ gurus could help me with something that I cant think of /10297124/how-to-combine-more-than-two-generic-lists-in-c-sharp-zip. One or more generic lists can be combined or merged using zip() method in C#. Below is an example of combining 4 lists by creating an extension method.

There is another quite interesting solution that I'm aware of. It's interesting mostly from educational perspective but if one needs to perform zipping different counts of lists A LOT, then it also might be useful.

This method overrides .NET's LINQ SelectMany function which is taken by a convention when you use LINQ's query syntax. The standard SelectMany implementation does a Cartesian Product. The overrided one can do zipping instead. The actual implementation could be:

static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source,
        Func<TSource, IEnumerable<TCollection>> selector, Func<TSource, TCollection, TResult> select)
{
    using (var e1 = source.GetEnumerator())
        using (var e2 = selector(default(TSource)).GetEnumerator())
            while (true)
                if (e1.MoveNext() && e2.MoveNext())
                    yield return select(e1.Current, e2.Current);
                else
                    yield break;
}

It looks a bit scary but it is a logic of zipping which if written once, can be used in many places and the client's code look pretty nice - you can zip any number of IEnumerable<T> using standard LINQ query syntax:

var titles = new string[] { "Analyst", "Consultant", "Supervisor"};
var names = new string[] { "Adam", "Eve", "Michelle" };
var surnames = new string[] { "First", "Second", "Third" };

var results =
    from title in titles
    from name in names
    from surname in surnames
    select $"{ title } { name } { surname }";

If you then execute:

foreach (var result in results)
    Console.WriteLine(result);

You will get:

Analyst Adam First
Consultant Eve Second
Supervisor Michelle Third

You should keep this extension private within your class because otherwise you will radically change behavior of surrounding code. Also, a new type will be useful so that it won't colide with standard LINQ behavior for IEnumerables.

For educational purposes I've created once a small c# project with this extension method + few benefits: https://github.com/lukiasz/Zippable

Also, if you find this interesting, I strongly recommend Jon Skeet's Reimplementing LINQ to Objects articles.

Have fun!

Elegant way to .Zip three lists together : csharp, One or more generic lists can be combined or merged using zip() method in C#. Below is an example of combining 4 lists by creating an extension method. 1. 2. 3 . 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. public static� Zip operator in C# is used for merging or combining two sequences into one sequence.If you have two lists of elements and you want to create a third list by combining elements in the two lists then you can use Zip LINQ operator.It is included as a query operator in C# 4.0 onward. Suppose if you have two classes defined for Employees working in your organisation and the departments to which they are assigned:

You can combine many lists in C# with cascade zip methods and anonymous classes and Tuple result.

List<string> list1 = new List<string> { "test", "otherTest" };
List<string> list2 = new List<string> { "item", "otherItem" };
List<string> list3 = new List<string> { "value", "otherValue" };

IEnumerable<Tuple<string, string, string>> result = list1
    .Zip(list2, (e1, e2) => new {e1, e2})
    .Zip(list3, (z1, e3) => Tuple.Create(z1.e1, z1.e2, e3));

The result is:

[0]
{(test, item, value)}
    Item1: "test"
    Item2: "item"
    Item3: "value"

Enumerable.Zip Method (System.Linq), Different ways to combine multiple lists in parallel (by order) in C# LINQ. In this article, we will see how to join multiple arrays, lists or collections by order with LINQ. Zip operator processes two sequences, pairing items and applying a I think sometimes the more generic underlying function is helpful� var combinedArrays = Combine(cislo, zprava, id, recDate); for (int i = 0; i < combinedArrays.Length; i++) { MessageBox.Show(i); MessageBox.Show(combinedArrays[i]); } If you want do execute an sql statement in the, would be nice if you create a new class and fill it with the data.

class Program
{
    static void Main(string[] args)
    {
        List<string> list1 = new List<string> { "test", "otherTest" };
        List<string> list2 = new List<string> { "item", "otherItem" };
        List<string> list3 = new List<string> { "value", "otherValue" };

        var result = CombineListsByLayers(list1, list2, list3);
    }

    public static List<string>[] CombineListsByLayers(params List<string>[] sourceLists)
    {
        var results = new List<string>[sourceLists[0].Count];

        for (var i = 0; i < results.Length; i++)
        {
            results[i] = new List<string>();
            foreach (var sourceList in sourceLists)
                results[i].Add(sourceList[i]);
        }
        return results;
    }

Combine one or more generic lists in C# – TechieSpice, How to combine more than two generic lists in C# Zip? 153. Convert JSON String to Pretty Print JSON output using Jackson. 1.

You can combine these List<string>'s into List<List<string>> and aggregate it

List<string> list1 = new List<string> { "test", "otherTest" };
List<string> list2 = new List<string> { "item", "otherItem" };
List<string> list3 = new List<string> { "value", "otherValue" };

var list = new List<List<string>>() { list1, list2, list3 }
    .Aggregate(
        Enumerable.Range(0, list1.Count).Select(e => new List<string>()),
        (prev, next) => prev.Zip(next, (first, second) => { first.Add(second); return first; })
    )
    .Select(e => new
    {
        a = e.ElementAt(0),
        b = e.ElementAt(1),
        c = e.ElementAt(2)
    });

Result

[
  {
    "a": "test",
    "b": "item",
    "c": "value"
  },
  {
    "a": "otherTest",
    "b": "otherItem",
    "c": "otherValue"
  }
]

See on dotnetfiddle.net

C# LINQ: Combine Multiple Sequences In Parallel, Elegant way to .Zip three lists together I was wondering if any LINQ gurus could help me with something that I cant think of today (wewlad Friday) I could write a small helper function that takes a param List then foreach to Zip all my lists together, but was wondering if there is a more elegant way to Zip three lists together instead of the

Use the Zip method from System.Linq. Zip uses a lambda on the elements from two collections. Zip. The Zip extension method acts upon two collections. It processes each element in two series together. With a Func instance, we use Zip to handle elements from two C# collections in parallel. Extension Func LINQ. Example.

The List<T> is a collection of strongly typed objects that can be accessed by index and having methods for sorting, searching, and modifying list. It is the generic version of the ArrayList that comes under System.Collection.Generic namespace.

Using the two LINQ methods, this can be implemented as follows. var result = first .Zip(second, (f, s) => new Type[] {a, b}) .SelectMany(x => x); As you can see, we first use Zip to take one element from each of the lists, and combine them into a small array of two elements, and then flatten all those arrays using SelectMany. This ends up exactly with the result we want.

Comments
  • Possible duplicate of Create Items from 3 collections using Linq
  • It's a good way to do that with (x, y) variables because I want to use for foreach statement and get values from each elements
  • Can you take a look over EDITED post ? Thank you
  • I've tried your example, but it gives every possible combination of list values rather than the zipped result you show.
  • On a side-note: it is easier to use Tuple.Create, then you do not have to specify the generic parameters.
  • Sometimes a cigar should remain simply a cigar.
  • I read the other answers which are better answers to your question. but honestly, why go for somthing which is so unreadable and takes x10 times more to write?