#c# #arrays #multidimensional-array
#c# #массивы #многомерный массив
Вопрос:
Я просто хочу спросить, какой лучший способ обойти двумерный массив (2 столбца), в котором будут храниться: имя кандидата и их соответствующее количество голосов.
Что я точно хочу сделать, так это принять ввод от пользователя, скажем: ПРОГОЛОСУЙТЕ ЗА Джона 10, где Джон — это имя кандидата, а 10 — это голоса, которые он хочет ему отдать. Итак, мне нужно сохранить {John, 10} в моем массиве. Однако после этого моя программа еще раз запросит у пользователя голоса, поэтому, если я введу VOTE Doe 15, запись {Doe, 15} будет добавлена в массив. Если пользователь введет VOTE John 2, мой массив необходимо обновить, и, таким образом, новым значением будет {John, 12}.
В настоящее время я использую два списка массивов: CandidateName и voteCount, и я просто полагаюсь на их индекс для сопряжения. Однако это не совсем надежно, поэтому я пытаюсь найти другой способ решения этой проблемы. Однако на самом деле я не большой поклонник многомерных массивов.
Может кто-нибудь, пожалуйста, указать мне хороший способ, как этого добиться?
Ответ №1:
public class VoteManager
{
public Dictionary<string, int> Votes { get; private set; }
public VoteManager
{
Votes = new Dctionary<string, int>();
}
public void AddVotes(string name, int voteCount)
{
int oldCount;
if (!Votes.TryGetValue(name, out oldCount))
oldCount = 0;
Votes[name] = oldCount voteCount;
}
Ответ №2:
Вам следует использовать ассоциативный массив. В случае C # такой коллекцией является Dictionary
.
var votes = new Dictionary<string, int>();
votes["John"] = 10;
votes["Bob"] = 20;
votes["John"] = 15; // replaces earlier setting
Если вы хотите добавить к существующему голосованию, вам нужно будет проверить, существует ли существующее значение:
private Dictionary<string, int> votesByPeep; // initialized in constructor
private void AddVotes(string peep, int votes)
{
if (this.votesByPeep.ContainsKey(peep)
{
this.votesByPeep[peep] = votes;
}
else
{
this.votesByPeep[peep] = votes;
}
}
Ответ №3:
Почему бы вам не определить структуру / класс с двумя свойствами, Name и voteCount. Тогда вам нужен только один массив.
Редактировать:
Я предложил это, потому что могут быть дополнительные операции или свойства, которые вы хотите добавить к кандидатам. Если все, что вам нужно, это связь между этими двумя значениями, словарь является правильным решением.
Ответ №4:
Похоже, что гораздо лучшим решением здесь является использование Dictionary<TKey, TValue>
. Словарь / хэш-таблица идеально подходит для сценария, в котором вы сопоставляете значение (количество голосов) с заданным ключом (именем пользователя). Это упрощает сценарии обновления и поиска
class Container {
private Dictionary<string, int> m_voteMap = new Dictionary<string, int>();
public void SetVote(string user, int votes) {
m_voteMap[user] = votes;
}
public int GetVotes(string user) {
int votes;
if (!m_voteMap.TryGetValue(user, out votes)) {
votes = 0;
}
return votes;
}
}
Ответ №5:
Вы можете использовать словарь от строк (имена) до int (голоса), это даст вам пару {имя, голоса} и приятный быстрый поиск
Ответ №6:
Создайте класс с именем CandidateVotes
и сохраните его в List<CandidateVotes>
коллекции.
public class CandidateVotes
{
public string Name {get; set;}
public int Votes {get; set;}
}
Ответ №7:
Dictionary<string, int> is your friend
Ответ №8:
Это звучит как хороший кандидат для Dictionary<T,U>
. В данном случае, Dictionary<string,int>
где ключом является кандидат, а значением — количество голосов.
// Create dictionary as:
Dictionary<string, int> votes = new Dictionary<string, int>();
Затем вы могли бы выполнить некоторые процедуры, подобные следующим:
void AddVotes(string candidate, int numberOfVotes)
{
if (this.votes.Contains(candidate))
{
// Update the "10 to 12" in your scenario
int current = this.votes[candidate];
current = numberOfVotes;
this.votes[candidate] = current;
}
else
this.votes[candidate] = numberOfVotes; // First time a candidate is used...
}
Когда вы хотите перечислить голоса за каждого кандидата, вы можете сделать что-то вроде:
foreach(var pair in this.votes)
{
Console.WriteLine("Candidate {0} has {1} votes.", pair.Key, pair.Value);
}