1

This is easy in a foreach loop - but I have several lists...

Example:

var ListA = new List<string>() { "One", "Two" };
var ListB = new List<string>() { "Three", "Four" };
var ListC = new List<string>() { "Five", "Six" };
var ListD = new List<string>() { "Seven", "Eight" };

My outcome would look like this:

One, Three, Five, Seven
One, Three, Five, Eight
One, Three, Six, Seven
One, Three, Six, Eight
One, Four, Five, Seven
One, Four, Five, Eight
One, Four, Six, Seven
One, Four, Six, Eight

And so on.

This works, but strikes me that there should be a better way of doing this.

foreach (var item in ListA)
{
    foreach (var item2 in ListB)
    {
        foreach (var item3 in ListC)
        {
            foreach (var item4 in ListD)
            {
                outputCombined.Append(item.Trim() + " " + ";" + " " + item2.Trim() + " " + ";" + " " + item3.Trim() + " " + ";" + " " + item4.Trim() + Environment.NewLine);
            }
        }
    }
}

I figure there might be a Linq solution to the problem?

Enigmativity
  • 113,464
  • 11
  • 89
  • 172
Kennetic
  • 83
  • 8

1 Answers1

1

To reduce the nesting, you can repeatedly use the from xxx in yyy clause, which basically translates to nested SelectMany calls.

var list1 = new List<string> { "One", "Two" };
var list2 = new List<string> { "Three", "Four" };
var list3 = new List<string> { "Five", "Six" };
var list4 = new List<string> { "Seven", "Eight" };

var query = from elem1 in list1
            from elem2 in list2
            from elem3 in list3
            from elem4 in list4
            select string.Join(", ", elem1, elem2, elem3, elem4);

Printing each element of query:

foreach (var elem in query) {
    Console.WriteLine(elem);
}

outputs

One, Three, Five, Seven
One, Three, Five, Eight
One, Three, Six, Seven
One, Three, Six, Eight
One, Four, Five, Seven
One, Four, Five, Eight
One, Four, Six, Seven
One, Four, Six, Eight
Two, Three, Five, Seven
Two, Three, Five, Eight
Two, Three, Six, Seven
Two, Three, Six, Eight
Two, Four, Five, Seven
Two, Four, Five, Eight
Two, Four, Six, Seven
Two, Four, Six, Eight
Sweeper
  • 213,210
  • 22
  • 193
  • 313