簡體   English   中英

查找最高票數並匹配字符串數組

[英]Finding highest number of votes and matching to array of string

我試圖弄清楚如何將候選人名稱與候選人投票相匹配,並顯示最高的投票和候選人姓名。

就像我如何匹配兩個數組一樣。

我知道我想念什么,但是呢? 我只是開始在家學習C#。

namespace NumberOfVotes
{
    class Program
    {
        static void Main(string[] args)
        {
            int size, minVotes;
            int[] numOfCandidates;
            int[] numOfVotes;
            double avgMarks;

            string[] candidateName;

            Console.WriteLine("Enter number of candidates");
            size = int.Parse(Console.ReadLine());

            numOfCandidates = new int[size];
            candidateName = new string[size];
            numOfVotes = new int[size];

            for (int i = 0; i < numOfCandidates.Length; i++)
            {
                Console.WriteLine("Enter a Candidate Name");
                candidateName[i] = Console.ReadLine();

                Console.WriteLine("Enter number of votes thus far");
                numOfVotes[i] = int.Parse(Console.ReadLine());
            }

            int max = numOfVotes.Max();          
            avgMarks = numOfVotes.Average();
            minVotes = numOfVotes.Min();

            Console.WriteLine("Average votes: {0}", avgMarks);
            Console.WriteLine("Min number of votes is: {0}", minVotes);
        }
    }
}

您應該為此使用字典

static void Main(string[] args)
{
    var candidates = new Dictionary<string, int>();
    Console.WriteLine("Enter number of candidates");
    var size = int.Parse(Console.ReadLine());

    for (int i = 0; i < size; i++)
    {
        Console.WriteLine("Enter a Candidate Name");
        var name = Console.ReadLine();

        Console.WriteLine("Enter number of votes thus far");
        var votes = int.Parse(Console.ReadLine());

        candidates.Add(name, votes);
    }

    Console.WriteLine("Average votes: {0}", candidates.Average(entry => entry.Value));
    Console.WriteLine("Min number of votes is: {0}", candidates.Min(entry => entry.Value));
}

看到這些想法,您可以腦海中思考。 如果您遇到問題,StackOverflow並不是發布問題的網站,僅當您遇到的問題需要可以幫助他人的解決方案時。

這將起作用(對我來說最直接的方法):

int maxIndex = -1;
int max = -1;

for (int i = 0; i < numOfCandidates.Length; i++)
{
    Console.WriteLine("Enter a Candidate Name");
    candidateName[i] = Console.ReadLine();

    Console.WriteLine("Enter number of votes thus far");
    int num = int.Parse(Console.ReadLine()); // <-- unsafe

    // just check it every time, if the number is greater than the previous maximum, update it.
    if (num > max)
    {
       max = num;
       maxIndex = i;
    }

    numOfVotes[i] = num;
}

Console.WriteLine("Candidate {0}, with {1} votes, has the most votes", candidateName[maxIndex], max);

但是,如果您想進行更多事情(例如誰的票數最少)而不進行此類事情,則應該使用Dictionary<string, int> 那是一個與數字關聯的字符串,一個與投票關聯的名稱。

(有關更多信息,請訪問: http : //www.dotnetperls.com/dictionary

解決該問題的方法是,執行以下操作:

int indexOfWinner = Array.IndexOf(numOfVotes, numOfVotes.Max());
string winner = candidateName[indexOfWinner];

我不知道您在C#和編程教育方面有多遠(OOP之類的東西),因此您可能會發現或發現以下幾點:

  • 您應該使用通用集合而不是原始數組(在這種情況下為List<> )。
  • 您應該將所有這些封裝到一個類中。

這就是我要做的:

class Program
{
    static void Main(string[] args) {
        Candidates c = new Candidates("foo", "bar", "baz");
        Random rand = new Random();
        c.addVote(0, rand.Next(100));
        c.addVote(1, rand.Next(100));
        c.addVote(2, rand.Next(100));

        Console.WriteLine(c.getWinner());

        Console.WriteLine("number of votes:");
        Console.WriteLine(c[0] + ": " + c[0].numberOfVotes);
        Console.WriteLine(c[1] + ": " + c[1].numberOfVotes);
        Console.WriteLine(c[2] + ": " + c[2].numberOfVotes);
    }
}

class Candidates
{
    private List<Candidate> candidates;

    public Candidate this[string name] {
        get {
            return candidates.First(v => v.name == name);
        }
    }
    public Candidate this[int index] {
        get {
            return candidates[index];
        }
    }

    public Candidates(string firstCandidate, params string[] candidates) { //this is done to disable an empty constructor call
                                                                           //and also allow multiple candidates
        this.candidates = new List<Candidate>(candidates.Length);
        this.candidates.Add(new Candidate(firstCandidate));
        foreach(var c in candidates) {
            this.candidates.Add(new Candidate(c));
        }
    }

    public void addVote(int candidateNumber, int numberOfVotes = 1) {
        candidates[candidateNumber].numberOfVotes += numberOfVotes;
    }

    public Candidate getWinner() {
        candidates.Sort((candidate1, candidate2) => candidate2.numberOfVotes.CompareTo(candidate1.numberOfVotes));
        return candidates[0];
    }
}

class Candidate
{
    public string name { get; private set; }
    public int numberOfVotes { get; set; }

    public Candidate(string name) {
        this.name = name;
        this.numberOfVotes = 0;
    }

    public override string ToString() {
        return name;
    }
}

您可能應該改用dictionary,但如果要使用array,請按以下步驟操作:

avgMarks = numOfVotes.Average();

int avgIndex = numOfVotes.ToList().IndexOf(avgMarks);

Console.WriteLine("Average votes: {0} Candidate Names: {1}", avgMarks, candidateName[avgIndex]);

您的代碼運行正常。 您正在尋找的是具有最高投票數的數組的索引。 該索引對於獲得最高投票數的候選人名稱也很有用。 因此,要獲取該索引,只需使用從此行獲得的最大值:

int max = numOfVotes.Max();

然后使用IndexOf靜態方法在數組中查找max的索引。 為此,請嘗試以下代碼行:

int index = Array.IndexOf<int>(numOfVotes, max);

現在只需打印出候選人姓名和最高投票數,如下所示:

Console.WriteLine(candidateName[index] + " has highest number of vote : " + numOfVotes[index] );

您可以從DotNetPerlsMSDNArray.IndexOf()有一個清晰的概念

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM