Работа с моим двумерным массивом

Я просто хочу спросить, как лучше всего работать с двумерным массивом (2 столбца), в котором будут храниться: CandidateName и их соответствующий VoteCount.

Что я хочу сделать, так это принять ввод от пользователя, сказав: VOTE John 10, где John - это имя кандидата, а 10 - это голоса, которые он хочет ему дать. Поэтому мне нужно сохранить {John, 10} в моем массиве. Однако после этого моя программа снова попросит пользователя проголосовать, поэтому, если я введу VOTE Doe 15, запись {Doe, 15} будет добавлена ​​в массив. Если пользователь вводит VOTE John 2, мой массив необходимо обновить, и поэтому новое значение будет {John, 12}.

В настоящее время я использую два массива: CandidateName и VoteCount, и я просто полагаюсь на их индекс для сопряжения. Однако это не очень надежно, поэтому я пытаюсь найти другой способ решить эту проблему. Однако я не большой поклонник многомерных массивов.

Может кто-нибудь указать мне хороший способ, как этого добиться?


person Smiley    schedule 20.05.2011    source источник


Ответы (6)


Вы должны использовать ассоциативный массив. В случае 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;
    }
}
person Paul Ruane    schedule 20.05.2011

Почему бы вам не определить структуру/класс с двумя свойствами: Name и VoteCount. Тогда вам нужен только один массив.

РЕДАКТИРОВАТЬ:

Я предложил это, потому что могут быть дополнительные операции или свойства, которые вы хотите добавить в Candidates. Если все, что вам нужно, — это связь между этими двумя значениями, словарь — правильное решение.

person Nathanael    schedule 20.05.2011

Похоже, гораздо лучшим решением здесь будет использование 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;
  }
}
person JaredPar    schedule 20.05.2011

Вы можете использовать словарь от строк (имена) до int (голоса), это даст вам пару {имя, голоса} и хороший быстрый поиск

person Neowizard    schedule 20.05.2011

Создайте класс с именем CandidateVotes и сохраните его в коллекции List<CandidateVotes>.

public class CandidateVotes
{
    public string Name {get; set;}
    public int Votes {get; set;}
}
person Ken Smith    schedule 20.05.2011

Это звучит как хороший кандидат на 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);
}
person Reed Copsey    schedule 20.05.2011