В C# каков наилучший способ сортировки двух или более массивов данных различного типа? Array.Sort, по-видимому, исключает только один тип данных одновременно - PullRequest
0 голосов
/ 08 марта 2020

Я могу отсортировать массив, используя один тип данных, такой как строка, но как я могу отсортировать другие массивы с разными типами данных и следовать в порядке возрастания того же типа данных строки?

Как видите, у меня есть один метод Array.Sort в нижней части моего кода с сортируемыми массивами playerName и playerPosition. Я хотел бы добавить массивы int [] atBats и hits. Затем мне нужно добавить среднее значение, которое является значением с плавающей точкой.

using System;
using static System.Console;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//My Baseball application named BatStat
namespace BatStat
{
    class Program
    {
        static void Main()
        {
            //My declared variables that hold the user input in memory
            string teamName;
            string[] playerName = new string[3];
            string[] playerPosition = new string[3];
            int[] atBats = new int[3];
            int[] hits = new int[3];


            //Begin program by requesting user to enter team name value
            WriteLine("Welcome to Bat Stat, enter team name");
            teamName = Console.ReadLine();

            //Traverse all arrays and accumalate values from user input
            for (int i = 0; i < playerName.Length; i++)
            {
                WriteLine("Enter players name");
                playerName[i] = ReadLine();
                WriteLine("Enter Players Position");
                playerPosition[i] = ReadLine();
                WriteLine("Enter Players at bats");
                atBats[i] = Convert.ToInt32(ReadLine());
                WriteLine("Enter Players hits");
                hits[i] = Convert.ToInt32(ReadLine());
            }

            //Display top row menu for Bat Stat table
            WriteLine("{0, -10}{1, -10}{2, -5}{3, -5}{4, -5}{5, -5}", "Team", "Player", "Pos", "AB", "H", "BA");

            //for loop to traverse the arrays and display user input data in tabular format
            for (int x = 0; x < playerName.Length; ++x)
            {
                Array.Sort(playerName, playerPosition);
                float playerBA = (float)hits[x] / atBats[x];
                WriteLine("{0, -10}{1, -10}{2, -5}{3, -5}{4, -5}{5, -4}", teamName, playerName[x], playerPosition[x], atBats[x].ToString("d"), hits[x].ToString("d"), playerBA.ToString("F3"));
            }

            //Display the team batting average at bottom in a single row
            float teamBA = (float)hits.Sum() / atBats.Sum();
            WriteLine("The batting average for the {0} is {1}", teamName, teamBA.ToString("F3"));

        }
    }
}

1 Ответ

2 голосов
/ 08 марта 2020

Поскольку вы кодируете на C#, объектно-ориентированном языке, вам следует рассмотреть возможность использования объектов. Вы можете объявить свой собственный класс для игрока, удерживая информацию, которую вы вводите каждый раз.

Затем, когда вы сортируете по имени и позиции игрока, все поля сортируются, потому что вы сортируете всех игроков между ними как целое, а не поле c.

Вы можете определить свой класс как:

public class Player
{
    public string Name { get; set; }
    public string Position { get; set; }
    public int AtBats { get; set; }
    public int Hits { get; set; }
}

Вы можете избавиться от нескольких массивов и использовать: Player[] players = new Player[3];

И в вашем l oop вы можете создавать игроков следующим образом:

for (int i = 0; i < players.Length; i++)
{
    var player = new Player();
    WriteLine("Enter players name");
    player.Name = ReadLine();
    WriteLine("Enter Players Position");
    player.Position = ReadLine();
    WriteLine("Enter Players at bats");
    player.AtBats = Convert.ToInt32(ReadLine());
    WriteLine("Enter Players hits");
    player.Hits = Convert.ToInt32(ReadLine());

    players[i] = player;
}

Надежда, которая немного прояснит ситуацию и поможет вам начать.

Что касается Само сравнение, у вас есть несколько способов сделать это. Если вы хотите использовать Array вместо List, самым простым способом будет Player реализовать интерфейс IComparable. Таким образом, каждый объект Player будет знать, как сравнивать себя с другим игроком.

Если я правильно понимаю, вы хотите отсортировать их сначала по имени, а затем по позиции? Затем вы можете изменить класс Player следующим образом:

public class Player : IComparable
{
    public string Name { get; set; }
    public string Position { get; set; }
    public int AtBats { get; set; }
    public int Hits { get; set; }

    public int CompareTo(object obj)
    {
        if (obj == null) return 1;
        var otherPlayer = obj as Player;
        int result = this.Name.CompareTo(otherPlayer.Name);
        if (result == 0) 
        {
            result = this.Position.CompareTo(otherPlayer.Position);
        }
        return result;
    }
}

Затем для сортировки игроков будет простой вызов: Array.Sort(players); и второй l oop вашей программы станет:

//for loop to traverse the arrays and display user input data in tabular format
Array.Sort(players);
for (int x = 0; x < players.Length; x++)
{
    var player = players[i];
    float playerBA = (float)player.Hits / player.AtBats;
    WriteLine("{0, -10}{1, -10}{2, -5}{3, -5}{4, -5}{5, -4}", teamName, player.Name, player.Position, player.AtBats, player.Hits, playerBA.ToString("F3"));
}

Просто примечание: вы сортировали массив 3 раза, но он был нужен только один раз. Здесь у вас есть 3 элемента, это не имеет значения, но если бы у вас было гораздо больше элементов, это стоило бы вам.

Вам также не нужен .ToString("d"), так как это значение по умолчанию для целого числа и преобразование .ToString() происходит автоматически при вызове WriteLine.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...