Что является хорошей заменой для большого коммутационного шкафа?
У меня есть объекты, называемые Country. В какой-то момент в программе я хочу установить мощность поля для каждого объекта.
Власть для каждой страны фиксирована, и у меня есть данные для всех 196 стран здесь на листе бумаги. Например, мой код должен проверять, если название страны - США (и если да, установите его мощность 100) и т.д.
Я знаю, что могу сделать это с помощью коммутационного футляра, но какой лучший, самый приятный и эффективный способ сделать это?
Ответы
Ответ 1
Вы можете хранить пары мощности страны в Dictionary<string, int>
, а затем просто получить оценку конкретной страны с помощью индексатора:
var points = new Dictionary<string,int>();
// populate the dictionary...
var usa = points["USA"];
Изменить: Как указано в комментариях, вы должны хранить информацию во внешнем файле, например, xml будет хорошим выбором. Таким образом, вам не нужно изменять код для добавления или удаления стран. Вам просто нужно сохранить их в XML файле, отредактировать его всякий раз, когда вам нужно. Затем проанализируйте его, когда ваша программа запустится, и загрузите значения в Dictionary
. Вы можете использовать LINQ to XML
для этого. Если вы не использовали его раньше есть хорошие примеры в документации , чтобы начать работу.
Ответ 2
В то время как ответ Selmans правильный и хороший, он не отвечает, как на самом деле заполнять словарь. Вот он:
var map = new Dictionary<string, int> {
{"USA", 100},
{"Germany", 110}
};
вы также можете просто добавить его следующим образом:
map.Add("USA", 100);
map.Add("Germany", 110);
Теперь вы можете получить доступ к значению (как уже упоминалось в Semans):
map["USA"] = 50; // set new value for USA
int power = map["USA"]; // get new value
EDIT: Как уже упоминалось в комментариях и других ответах, вы, конечно, можете хранить данные во внешнем файле или в любом другом хранилище данных. Сказав это, вы можете просто инициализировать пустой словарь, а затем заполнить его добавленным методом, ранее упомянутым для каждой записи в этом хранилище.
Ответ 3
Это правильный вопрос для начала, но вам нужно много чего научиться. Многие люди дали вам ответы на заданный вами вопрос. Я буду раздражать Zen и скажу вам, чтобы убрать этот вопрос, потому что есть большая проблема для решения.
Вместо жесткого кодирования сохраните связанные свойства в n-кортеже, также известном как строка базы данных, и используйте механизм базы данных для управления отношениями между ними. И тогда, поскольку вы используете С#, вероятно, было бы разумно научиться использовать LINQ. Но прежде чем вы это сделаете, изучите теорию моделирования данных, потому что моделирование данных - это то, что вы делаете.
Ответ 4
Поскольку вы сказали, что у вас есть "объекты" под названием "Страна", и вы отметили свой вопрос "С#", кажется, что у вас есть две силы для работы в вашем коде. Один из них заключается в том, что необходимость ссылаться на карту, однако эффективно реализована, не так дешева, как обращение к переменной-члену. С другой стороны, может быть какая-то польза от установки, где все атрибуты страны могут быть найдены в том же месте, что и атрибуты других стран (решения, ориентированные на карту, затрагивают эту проблему). Но эти силы можно примирить примерно так:
class Country { // Apologies that this sketch is more C++ than C#
public:
Country(string name_, int power_);
private:
string name;
int power;
};
void MakeCountries()
{
countries.Add(new Country("USA", 50));
countries.Add(new Country("Germany", 60));
// ....
}
Ответ 5
Вам нужно обновить свои данные во время выполнения?
-
Да? Загрузите данные из внешнего хранилища в словарь.
-
Нет? Использовать переключатель
Пусть компилятор генерирует словари и поисковые запросы на основе хэша.
Когда профайлер начинает кричать, исследуйте альтернативные решения.
Например, прочитайте ответ из Что быстрее, включите строку или elseif по типу? ".
Ответ 6
Как сделать массив строк для хранения названий стран в порядке возрастания их мощности. Это будет проще реализовать. Тогда индекс каждой страны может представлять свою силу. Это возможно, только если мощность продолжает подсчет чисел.
Если его нет, другой способ - реализовать их как связанный список. Так что u будет в состоянии изменить, если вы хотите. Список с двумя полями; 1 для страны и других для власти