我可以使用哪些数据结构来表示.Net中强类型的2D数据矩阵?

时间:2009-11-18 00:13:47

标签: c# .net data-structures

我正试图代表比赛的记分牌,并且正在努力使用最好的数据结构。

我有一个Player个对象的列表,一个Round个对象的列表,对于每个组合,我需要存储一个RoundScore个对象(分数的各个部分)一轮)。

我想要的是一些整体Scoreboard对象,其中包含以下内容:

1 - 我可以通过提供RoundScore对象来访问由Round个键标识的Player个对象的集合。例如,可能是:

public IDictionary<Round,RoundScore> PlayerScores(Player player) { ... }

2 - 我可以通过提供RoundScore对象来访问由Player个键标识的Round个对象的集合。 e.g:

public IDictionary<Player,RoundScore> RoundScores(Round round) { ... }

3 - 我可以通过提供RoundScorePlayer

来访问单个Round对象

4 - 我可以添加新的Round,并且所有Players将获得该轮次的新RoundScore,其默认值为

5 - 同样,我可以添加新的Player,所有Rounds将为该播放器设置一个新的RoundScore,其默认值为


我想我真正想要的是一个网格的表示,其中Rounds在一个轴上,Players在另一个轴上,RoundScores在中间。

.Net中是否存在我可以使用的任何数据结构(或数据结构的组合),还是我必须自己动手?

2 个答案:

答案 0 :(得分:4)

我相信你必须自己动手。您可以将数据矩阵存储在以下其中一个中:

List<List<RoundScore>>

然后在Round中,添加一个存储该Round分数索引的字段。 同样,在玩家中,为该玩家的分数添加一个字段。

如果行是一轮的分数,那么返回该列表是微不足道的。要返回播放器的分数列表,您可以创建一个实现IList的类,它知道如何通过索引访问分数。通过这样做,您无需在每次请求时将分数复制到新列表中。

例如:

List<Player> Players;
List<Round> Rounds;
List<List<RoundScore>> Scores;


List<RoundScore> GetRoundScores(Round round)
{
    return Scores[round.Index];
}

IList<RoundScore> GetRoundScores(Player player)
{
    return new PlayerScoreList(Scores, player.Index); // or better yet, cache this
}


public class PlayerScoreList : IList<RoundScore>
{
    private List<List<RoundScore>> _scores;
    private int _playerIndex;

    public RoundScore this[int index]
    {
        get
        {
            return _scores[_playerIndex][index];
        }
        set
        {
            _scores[_playerIndex][index] = value;
        }
    }

    public PlayerScoreList(List<List<RoundScore>> scores, int playerIndex)
    {
        _scores = scores;
        _playerIndex = playerIndex;
    }

    public void Add(RoundScore item)
    {
        throw new NotSupportedException();
    }

    public void Clear()
    {
        throw new NotSupportedException();
    }

    public bool Contains(RoundScore item)
    {            
        for (int i = 0; i < Count; i++)
        {
            if (this[i].Equals(item))
            {
                return true;
            }
        }

        return false;
    }

    public int Count
    {
        get { return _scores[0].Count; }
    }

    public IEnumerator<RoundScore> GetEnumerator()
    {
        for (int i = 0; i < Count; i++)
        {
            yield return this[i];
        }
    }

    // ... more methods

}

答案 1 :(得分:0)

怎么样?

public class Matrix
{
    public List<Player> Players;
    public List<Round> Rounds;
    public Dictionary<Tuple<Player, Round>, RoundScore> RoundScores;
}