如何对拆分数组进行排序以从最高到最低读取?

Lyn*_*eth 1 .net c# arrays sorting

我需要一点帮助将分割数组排序为从最高到最低,同时将名称保持在分数旁边.我有点不确定如何这样做,因为阵列是分裂的.此外,有没有办法让用户输入任意数量的名称和分数,而程序没有给用户一个错误?所以如果他们只想输入4个名字和分数,他们所要做的就是按回车键吗?

这是我到目前为止的代码.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace proj09LEA
{
    class Program
    {
        static void Main(string[] args)
        {
            // declare and array of integers          
            string[] name = new string[5];
            int[] score = new int[5];

            Console.WriteLine("\nSaturday Coder's Bowling Team");
            Console.WriteLine("Enter in a name and score for each person on the team.");
            Console.WriteLine("For example, Mary 143. Just hit Enter when you are done.\n");

            // fill an array with user input
            for (int i = 0; i < score.Length; i++)
            {
                Console.WriteLine("Enter in a name and score: ");
                string line = Console.ReadLine();

                name[i] = line.Substring(0, line.IndexOf(' '));
                score[i] = int.Parse(line.Substring(line.IndexOf(' ') + 1));
            }

            Console.WriteLine("------------ Input Complete ------------\n");
            Console.WriteLine("Here are the scores for this game, from highest to lowest:\n");

            for (int i = 0; i < score.Length; i++)
            {
                if (score[i] >= 300)
                {
                    Console.WriteLine("{0}'s score was {1}*.", name[i], score[i]);
                }
                else
                {
                    Console.WriteLine("{0}'s score was {1}.", name[i], score[i]);
                }
            }

            AverageScore(score);

            Console.WriteLine("Press Enter to continue. . .");
            Console.ReadLine();
        }

        static void AverageScore(int[] score)
        {
            int sum = score.Sum();
            int average = sum / score.Length;
            Console.WriteLine("The average score for this game was {0:d}.\n", average);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ick*_*fay 5

让我首先解决无限玩家的问题.如你所知,数组的大小在创建时是固定的.List但是,有一种数据结构可以具有无限(实际上)数量的元素.您可以创建一个这样的:

List<string> names = new List<string>();
Run Code Online (Sandbox Code Playgroud)

然后,如果要添加新名称,则可以使用

names.Add("Mary");
Run Code Online (Sandbox Code Playgroud)

你的其余代码应该工作相同; 索引工作正常,求和工作正常,等等.


那么把它们一起排序呢?好吧,你真的没有名单和分数列表; 你在语义上真正拥有的是名单和分数对的列表,或者一组玩家.您可以先定义一个代表玩家的结构:

struct Player {
    public string Name { get; set; }
    public int Score { get; set; }

    public Player(string name, int score) {
        Name = name;
        Score = score;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以得到一个玩家列表:

List<Player> players = new List<Player>();
Run Code Online (Sandbox Code Playgroud)

我们不是单独添加名称和分数,而是将它们一起添加:

string name = /* ... */;
int score = /* ... */;
players.Add(new Player(name, score));
Run Code Online (Sandbox Code Playgroud)

代表这样,您的打印程序也变得更简单.您可以一次迭代两个:

foreach(Player player in players) {
    Console.WriteLine("{0} scored {1}", player.Name, player.Score);
}
Run Code Online (Sandbox Code Playgroud)

最后,总结有点棘手,但并不太难.基本上,我们提取所有分数并总结:

int sum = players.Select((player) => player.Score).Sum();
Run Code Online (Sandbox Code Playgroud)

但对你来说,真正的好处是终于能够对它进行排序:

players.Sort((x, y) => y.Score - x.Score);
Run Code Online (Sandbox Code Playgroud)