围绕我的二维数组工作

本文关键字:工作 二维数组 我的 | 更新日期: 2023-09-27 17:57:00

我只是想问一下,解决二维数组(2列)的最佳方法是什么,该数组将存储:Candidate Name及其各自的VoteCount。

我确切地想做的是,接受用户的输入,说:投票约翰10,其中约翰是候选人的名字,10是他想给他的选票。所以我需要将 {John, 10} 存储到我的数组中。但是,在此之后,我的程序将再次要求用户投票,因此如果我输入 VOTE Doe 15,则条目 {Doe, 15} 将被添加到数组中。如果用户输入 VOTE John 2,我的数组需要更新,因此新值将是 {John, 12}。

目前我使用两个数组列表:Candidate Name 和 VoteCount,我只依靠它们的索引进行配对。但是,这并不可靠,所以我正在尝试找到另一种解决此问题的方法。但是,我并不是多维数组的忠实粉丝。

有人可以指出我如何实现这一目标的好方法吗?

围绕我的二维数组工作

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

您应该使用关联数组。在 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;
    }
}

为什么不定义一个具有两个属性的结构/类,Name 和 VoteCount。那么你只需要一个数组。

编辑:

我之所以建议这样做,是因为您可能要向候选人添加其他操作或属性。如果您只需要这两个值之间的关联,字典是正确的解决方案。

听起来这里

更好的解决方案是使用 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;
  }
}

您可以使用从字符串(名称)到 int(投票)的字典,这将为您提供 {name, votes} 对和一个很好的快速查找

创建一个名为 CandidateVotes 的类,并将其存储在List<CandidateVotes>集合中。

public class CandidateVotes
{
    public string Name {get; set;}
    public int Votes {get; set;}
}
Dictionary<string, int> is your friend

听起来像是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);
}