围绕我的二维数组工作
本文关键字:工作 二维数组 我的 | 更新日期: 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);
}