Это зависит от того, хотите ли вы проверить по позиции (например, «Кто занял третье место?») Или водителю (например, «Какую позицию занял Уилсон?»). Это также зависит от того, насколько вы заботитесь о производительности в сценарии, который звучит так, как будто это не будет иметь большого значения для вашего приложения в целом.
Как правило, словарь будет полезен для поиска. Однако, если диапазон ключей известен, мал и непрерывен («гоночная позиция» соответствует всем трем критериям), тогда словарь не предлагает ничего, кроме массива (и имеет больше накладных расходов). Поэтому, если вы хотите выполнить запрос по позиции, используйте массив, потому что это самый простой инструмент, который соответствует описанию работы.
Если вы хотите сделать запрос по драйверу, то сначала вы должны ответить на вопрос "как точно определяется личность Driver
?" (ответом может быть «каждый водитель уникально идентифицируется по своей фамилии, имени и дате рождения»).
Затем вы можете заставить класс Driver
реализовать IEquatable<Driver>
, используя эти критерии, и поместить его в Dictionary<Driver, Positions>
, где я использую класс ниже, чтобы избежать нескольких словарей.
class Positions
{
public int Predicted { get; set; }
public int Actual { get; set; }
}
Тем не менее, вы должны спросить себя, есть ли смысл идти ко всем этим неприятностям вместо того, чтобы иметь массив, например. Tuple<Driver, Positions>
и цикл по массиву, чтобы найти драйвер, который вы хотите каждый раз. Это может показаться неэффективным в теории, но если у вас есть только 20 драйверов, это будет намного быстрее, чем словарь.
Наконец, я не вижу необходимости в том, чтобы пометить эти структуры данных как неизменяемые и / или обеспечить неизменность. Поскольку ваше приложение работает в режиме только для чтения и не содержит кода, который пытается отправить данные обратно в базу данных, я думаю, что совершенно очевидно, что бессмысленно изменять данные в коде.