【问题标题】:How to represent all possible pairs of a Multidimensional Array String[,]如何表示多维数组 String[,] 的所有可能对
【发布时间】:2018-10-18 22:01:32
【问题描述】:

我正在尝试混合两个多维数组,因此可以用所有可能的对来表示一个列表。例如,属于特定联赛(Bundesliga or La Liga) 的球员可以参加这些球队(Bayern Munich, Real Madrid, Or FC Barcelona),而拥有此(*) 的球员可以参加所有球队。这是两个数组:

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", "*" } };

输出:

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

如何表示该输出?非常感谢您的帮助!

【问题讨论】:

  • 用自制的循环和打印?
  • 如果您使用对象和枚举而不是字符串,这会更容易一些。可能有一个 Linq 查询可以使用连接运行,它可能会给你想要的结果,但我不确定从哪里开始只使用多维字符串数组。
  • 您能解释一下为什么对此投反对票吗?这是原始要求或太害怕了

标签: c# arrays sorting multidimensional-array console-application


【解决方案1】:

另一种方法是创建可用团队的查找和列表,然后使用这些东西来创建您想要的列表

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!我也试过你的代码,但我无法工作或找到你有“ToHashSet()”和“SelectMany()”的方法
  • @Jacman 你必须在使用SelectMany()ToHashSet()之前添加using System.Reactive.Linq;
  • 添加这两个命名空间using System.Collections.Generic; using System.Linq;
【解决方案2】:

这段代码应该可以工作。

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]}]");
    }
  }
}

编辑:(2018/5/9 9:58)

这是你想要的方法。

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(干净的代码)。这就是我要找的东西!
  • 我建议使用数组数组而不是多维数组,因为它是一种扭曲的类型。检查这个:stackoverflow.com/questions/2893297/…
  • 如何将你必须的代码返回给 static void Main() 从以下: public String[,] matchPlayers(String[,] LeaguePairs, String[,] playerPairs) { // 你的代码返回; }
  • 非常感谢!它确实有很大帮助。
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多