Какие структуры данных я могу использовать для представления строго типизированной двумерной матрицы данных в .Net? - PullRequest
0 голосов
/ 18 ноября 2009

Я пытаюсь представить табло для соревнований и борюсь с лучшими структурами данных для использования.

У меня есть список Player объектов, список Round объектов, и для каждой комбинации мне нужно хранить объект RoundScore (в раунде есть разные части).

Что бы я хотел, это какой-то общий Scoreboard объект, в котором содержится следующее:

1 - я могу получить доступ к коллекции RoundScore объектов, идентифицированных ключами Round, предоставив объект Player. Например, может быть что-то вроде:

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

2 - я могу получить доступ к коллекции RoundScore объектов, идентифицированных ключами Player, предоставив объект Round. например:

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

3 - я могу получить доступ к одному RoundScore объекту, указав Player и Round

4 - я могу добавить новый Round, и все Players получат новый RoundScore для этого раунда со значениями по умолчанию

5 - аналогично, я могу добавить новый Player, и у всех Rounds будет новый RoundScore для этого игрока со значениями по умолчанию


Полагаю, что я действительно искал изображение сетки с Rounds на одной оси, Players на другой и RoundScores в середине.

Есть ли какая-либо структура данных (или комбинация структур данных) уже в .Net, которую я могу использовать для этого, или мне придется свернуть свою собственную?

Ответы [ 2 ]

4 голосов
/ 18 ноября 2009

Полагаю, вам придется кататься самостоятельно. Вы можете хранить свою матрицу данных в одном из них:

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

}
0 голосов
/ 26 июня 2018

Как насчет чего-то вроде:

public class Matrix
{
    public List<Player> Players;
    public List<Round> Rounds;
    public Dictionary<Tuple<Player, Round>, RoundScore> RoundScores;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...