C# 如何。。。使用对象作为索引的二维矩阵?

C# 如何。。。使用对象作为索引的二维矩阵?,c#,object,multidimensional-array,indexing,C#,Object,Multidimensional Array,Indexing,如果有2个班级,团队和游戏。 大概是这样的: class Team {...} class Games { Team team1; Team team2; ... } 我有一张玩过的所有游戏的清单 列出所有游戏 我现在想做的是:为了进一步统计,我需要一个矩阵来计算每支球队与其他球队比赛的频率 早些时候,我会通过以下方式解决这个问题: int[,] countTeamVsTeam = new int[allTeams.Count, allTeams.Count]; fo

如果有2个班级,团队和游戏。 大概是这样的:

class Team {...}
class Games
{
    Team team1;
    Team team2;
    ...
}
我有一张玩过的所有游戏的清单

列出所有游戏

我现在想做的是:为了进一步统计,我需要一个矩阵来计算每支球队与其他球队比赛的频率

早些时候,我会通过以下方式解决这个问题:

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, Team), int> countTeamVsTeam = new Dictionary<(Team, Team), int>();
但正如上面的评论所指出的,你需要严格控制每支球队主客场的顺序,按字母顺序,按id排序等等

countTeamVsTeam[team1,team2]与countTeamVsTeam[team2,team1]的值不同


另一个选项是创建自定义集合。在该方法中,您以一种外部不可见的方式对团队进行内部控制,这样您就可以提取此细节并控制团队的顺序,这样无论团队传递到集合中的顺序如何,您都只存储一个值。

我发现这两种方法的问题是,如果您查找[team1],就可以了[team2],但是[team2][team1]它不会产生相同的结果。这很好,我区分主队和客队。我建议使用值元组作为字典的键:DictionaryAre teams interned?引用等式在逻辑上正确吗?是。团队是独一无二的,在程序的整个生命周期中都存在。我非常喜欢元组/组合键。我不知道这个存在!但是为什么团队的顺序应该是字母顺序还是Id顺序?对象引用是字典的关键,因此这甚至应该适用于不可排序的项……您需要有一个规则/算法来定义哪个是team1,哪个是team2,这是一致的。如上所述,如果您交换订单,您将获得不同的值!这不是一个问题,因为它是明确定义的。game.team1是team1,game.team2是team2:-