0

I'm trying to mix two multidimensional Arrays, so a list can be represented with all possible pairs. For Example, players who belong to a particular league(Bundesliga or La Liga) can play in these teams(Bayern Munich, Real Madrid, Or FC Barcelona) and a player with this (*) can play in all teams. These are the two Arrays:

String[,] leaguePairs = new String[3, 2] { { "Bayern Munich", "Bundesliga" }, { "Real Madrid", "La Liga" }, { "FC Barcelona", "La Liga" } };
String[,] playerPairs = new String[4, 2] { { "Player-1", "Bundesliga" }, { "Player-2", "La Liga" }, { "Player-3", "La Liga" }, { "Player-4", "*" } };

Output:

[Player-2, Real Madrid],
[Player-2, FC Barcelona],
[Player-1, Bayern Munich],
[Player-4, Real Madrid],
[Player-4, FC Barcelona],
[Player-4, Bayern Munich]

How can I represent that output? Thanks a lot for the help on this!

Jacman
  • 1,486
  • 3
  • 20
  • 32
  • 2
    with homemade loops and prints? – Liora Haydont May 08 '18 at 21:10
  • 2
    This would be somewhat easier if you were working with objects and enums instead of strings. There is probably a Linq query you can run with joins that may give you the results you want, but I'm not sure where to start on that with just multi-dimensional string arrays. – Ron Beyer May 08 '18 at 21:15
  • Can you explain why the down-vote on this? This is an original requirement or too scared – Jacman May 08 '18 at 21:23

2 Answers2

2

Another approach would be to create a lookup and list of teams available and then use these things to create the list you wanted

var leaguePairs = new String[3, 2] { { "Bayern Munich", "Bundesliga" }, { "Real Madrid", "La Liga" }, { "FC Barcelona", "La Liga" } };
var playerPairs = new String[4, 2] { { "Player-1", "Bundesliga" }, { "Player-2", "La Liga" }, { "Player-3", "La Liga" }, { "Player-4", "*" } };

var lookup = Enumerable.Range(0, leaguePairs.GetLength(0))
                       .Select(row =>
                                     new {
                                            Key = leaguePairs[row, 1],
                                            Value = leaguePairs[row, 0]
                                         })
                       .ToLookup(x => x.Key, 
                                 x => x.Value);

var teams = Enumerable.Range(0, leaguePairs.GetLength(0))
                      .Select(row => leaguePairs[row, 0])
                      .ToHashSet();

var list = Enumerable.Range(0, playerPairs.GetLength(0))
                     .SelectMany(row =>  
                                 playerPairs[row, 1] == "*" 
                                 ? 
                                 teams.Select(team => 
                                       new { 
                                           Name = playerPairs[row, 0], 
                                           Team = team 
                                      })
                                      .ToList()
                                  : 
                                  lookup[playerPairs[row, 1]]
                                  .Select(team => 
                                     new { 
                                          Name = playerPairs[row, 0], 
                                          Team = team 
                                     })
                                   .ToList()
                      ).ToList();
Rudresha Parameshappa
  • 3,826
  • 3
  • 25
  • 39
1

This code should work.

String[,] leaguePairs = new String[3, 2] { { "Bayern Munich", "Bundesliga" }, { "Real Madrid", "La Liga" }, { "FC Barcelona", "La Liga" } };
String[,] playerPairs = new String[4, 2] { { "Player-1", "Bundesliga" }, { "Player-2", "La Liga" }, { "Player-3", "La Liga" }, { "Player-4", "*" } };

for (var i = 0; i < leaguePairs.GetLength(0); i++)
{
  for (var j = 0; j < playerPairs.GetLength(0); j++)
   {
    if (Equals(playerPairs[j, 1], leaguePairs[i, 1]) || Equals(playerPairs[j, 1], "*"))
   {
     Console.WriteLine($@"[{playerPairs[j, 0]}, {leaguePairs[i, 0]}]");
    }
  }
}

Edit: (2018/5/9 9:58)

Here is the method you want.

public String[,] MatchPlayers(String[,] leaguePairs, String[,] playerPairs)
    {
        var results = new List<(string, string)>();
        for (var i = 0; i < leaguePairs.GetLength(0); i++)
        {
            for (var j = 0; j < playerPairs.GetLength(0); j++)
            {
                if (Equals(playerPairs[j, 1], leaguePairs[i, 1]) || Equals(playerPairs[j, 1], "*"))
                {
                    results.Add((playerPairs[j, 0], leaguePairs[i, 0]);
                }
            }
        }

        var stringArray = new String[results.Count, 2];
        for (var i = 0; i < results.Count; i++)
        {
            var result = results[i];
            stringArray[i, 0] = result.Item1;
            stringArray[i, 1] = result.Item2;
        }

        return stringArray;
    }
shtse8
  • 1,092
  • 12
  • 20
  • 1
    Thank you @shtse8 (clean code). This is what I was looking for! – Jacman May 08 '18 at 21:32
  • 1
    I recommend using array of array instead of muti-dimensional array as it's a wried type. Check this: https://stackoverflow.com/questions/2893297/iterate-multi-dimensional-array-with-nested-foreach-statement – shtse8 May 08 '18 at 21:48
  • 1
    How would return the code you have to static void Main() from the following: public String[,] matchPlayers(String[,] leaguePairs, String[,] playerPairs) { // Your code return ; } – Jacman May 09 '18 at 01:39
  • Thank you so much! it does help a lot. – Jacman May 09 '18 at 02:23