代码之家  ›  专栏  ›  技术社区  ›  Damovisa

我可以使用什么数据结构来表示.NET中强类型的二维数据矩阵?

  •  0
  • Damovisa  · 技术社区  · 15 年前

    我正试图代表一个记分板的竞争,并正在努力使用最好的数据结构。

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

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

    1-我可以访问 圆形记分 对象标识人 回合 通过提供 玩家 对象。例如,可能类似于:

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

    2-我可以访问 圆形记分 对象标识人 玩家 通过提供 回合 对象。例如:

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

    3-我可以访问一个 圆形记分 通过提供 玩家 和A 回合

    4-我可以添加新的 回合 以及所有 Players 会得到新的 圆珠笔 对于具有默认值的那一轮

    5-同样,我可以添加一个新的 玩家 以及所有 Rounds 会有新的 圆珠笔 对于具有默认值的播放机


    我想我真正想要的是一个网格的表示 查房 在一个轴上, 球员 另一方面,以及 RoundScores 在中间。

    .NET中是否已经有任何数据结构(或数据结构的组合)可供使用,或者我必须自己滚动?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Neil    15 年前

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

    List<List<RoundScore>>
    

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

    如果行是一个回合的分数,那么返回该列表就很简单了。要返回玩家的分数列表,可以创建一个实现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
    
    }
    
        2
  •  0
  •   ChrisFox    6 年前

    比如:

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