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

#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);
}