Как ... 2-мерная матрица, используя объект в качестве индекса? - PullRequest
0 голосов
/ 08 января 2020

Если есть 2 класса, Команды и Игры. Примерно так:

class Team {...}
class Games
{
    Team team1;
    Team team2;
    ...
}

И у меня есть список всех сыгранных игр ...

List<Games> allGames ...

Что я сейчас хочу сделать: для дальнейшего статистика Мне нужна матрица, которая подсчитывает, как часто каждая команда играла против любой другой команды.

Ранее я бы решил это следующим образом:

int[,] countTeamVsTeam = new int[allTeams.Count, allTeams.Count];

foreach (Game game in allGames)
{
    countTeamVsTeam[game.team1.SOMENUMBER,game.team2.SOMENUMBER]++;
}

Теперь мне интересно, хорошая ли это идея? чтобы пропустить этот искусственный атрибут SOMENUMBER и использовать объекты сами по себе в качестве индекса моей структуры данных:

Dictionary<Team, Dictionary<Team, int>> countTeamVsTeam = new Dictionary<Team, Dictionary<Team, int>>();
// initialize 
foreach (Team team1 in allTeams)
{
    countTeamVsTeam[team1] = new Dictionary<Team, int>();
    foreach (string team2 in allTeams)
    {
        countTeamVsTeam[team1][team2] = 0;
    }
}

foreach (Game game in allGames)
{
    countTeamVsTeam[game.team1,game.team2]++;
}

Есть мысли по этому поводу?

Это хороший способ сделать это?

Является ли Dictionary<Team, Dictionary<Team, int>> хорошей структурой данных для представления двумерной матрицы? (да, я знаю, что это не массив, а словарь словарей ...)

1 Ответ

1 голос
/ 08 января 2020

Я вижу несколько вариантов.

Словарь действительно может иметь кортеж / составной ключ, поэтому вы можете определить его следующим образом

Dictionary<(Team, Team), int> countTeamVsTeam = new Dictionary<(Team, Team), int>();

Но, как указано в комментариях выше , вам нужно строго контролировать порядок каждой команды (дома против гостей, в алфавитном порядке, упорядоченный по id et c.), так как

countTeamVsTeam[(team1, team2)] не будет иметь такое же значение, как countTeamVsTeam[(team2, team1)]

Другой вариант - создать собственную коллекцию. В рамках которого вы внутренне управляете командами таким образом, который не виден снаружи, чтобы вы могли абстрагировать эту деталь и контролировать порядок команд, чтобы хранить только одно значение независимо от того, какой порядок команды переданы в коллекцию.

...