Проблема с массивом переменных моего класса не работает должным образом - С#

Чтобы дать некоторый контекст. Итак, для этого проекта у меня есть массив переменных моего класса, файл cd1. Это переменная для AudioCD, и это массив, потому что, если пользователь хочет ввести в массив больше компакт-дисков.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я ввожу в массив классов более одного компакт-диска, проблема возникает примерно в той части, где я добавляю строку или исполнителя. Когда я иду печатать определенный индекс переменных класса, который должен быть отдельным, в основном все, кроме массива исполнителей, для отображения последних введенных строк по какой-то странной причине. Я пытаюсь понять, почему он это делает.

PS. Извините, мое объяснение не самое лучшее.

Как вы видите на изображении. Выход должен быть, когда я ввожу 1 для выбора и 1 для компакт-диска, массив должен использовать массив для индекса 0, но он использует массив из последнего введенного компакт-диска. Вывод должен быть:

мужчина1 мужчина2 мужчина3

но это:

мужчина4 мужчина5 мужчина6

    class AudioCD
    {
        // Private Variables for CDclass 
        public string cdTitle { get; private set; }
        private string[] artists = new string[4];
        public int releaseYear { get; private set; }
        public string genre { get; private set; }
        public float condition { get; private set; }

        // Constructor for the CDclass - initializes all variables used in the CDclass
        public AudioCD()
        {
            cdTitle = "";
            artists = new string[] {"","","",""};
            releaseYear = 1980;
            genre = "";
            condition = 0.0f;
        }

        // Overload Constructor for the CDclass - initializes all the variables to user input variables
        public AudioCD(string cdt, string[] art, int reY, string gen, float con)
        {
            
            cdTitle = cdt;

            if (artists.Length < art.Length)
            {
                Console.WriteLine("Your Array size is bigger then 4 for the Artist so the first 4 names will be used!");
            }
            artists = art;

            if (reY < 1980)
            {
                releaseYear = 1980;
            }
            else
            {
                releaseYear = reY;
            }
            genre = gen;
            if (con < 0.0f || con > 5.0f)
            {
                condition = 0.0f;
            }
            else
            {
                condition = con;
            }
        }

        public void printAudioCD()
        {
            Console.Write(cdTitle + ", " + releaseYear + "\n" );
            for (int i = 0; i < artists.Length; i++)
            {
                if (artists[i] != "" )
                {
                    Console.WriteLine("Artist (#" + (i + 1) + "): " + artists[i]);
                }
            }
            Console.WriteLine("Genre: " + genre);
            Console.WriteLine("Condition: " + condition);

        }

    }

и Program класс:

class Program
{
    static void Main(string[] args)
    {
        // variables
        string uI, cdtitle, genre;
        int size = 0, releaseYear, choice, arrInd;
        string[] artistArray = new string[4] {"", "", "", "" };
        float condition;

        //
        AudioCD remote = new AudioCD();

        Console.Write("How many CDs do you have lying around your car? ");
        uI = Console.ReadLine();
        size = Convert.ToInt32(uI);

        AudioCD[] cd1 = new AudioCD[size];

        for (int i = 0; i < size; i++)
        {
            Console.WriteLine("CD #" + (i + 1));
            Console.Write("*Enter Title: ");
            uI = Console.ReadLine();
            cdtitle = uI;

            Console.WriteLine("*Enter Artists (type -1 when finished):");
             int j = 0;
            do
            {
                uI = Console.ReadLine();
                if (uI != "-1")
                    artistArray[j] = uI;
                j++;

                // Resize the array by One Element
                if (j >= 4 && uI != "-1")
                {
                    Array.Resize(ref artistArray, artistArray.Length + 1);
                    artistArray[j] = "";
                }

            } while (uI != "-1" );

            Console.Write("*Enter Genre: ");
            uI = Console.ReadLine();
            genre = uI;

            Console.Write("*Enter Release Year: ");
            uI = Console.ReadLine();
            releaseYear = Convert.ToInt32(uI);

            Console.Write("*Enter Condition: ");
            uI = Console.ReadLine();
            condition = float.Parse(uI);

            Console.Write("\n");

            // switch to select which class of cd to put information in
            cd1[i] = new AudioCD(cdtitle, artistArray, releaseYear, genre, condition);
            

        }

        bool isPlaying = true;

        while(isPlaying)
        {
            Console.Write("\n");
            Console.WriteLine("[Main Menu]");
            Console.WriteLine("1) Album Info");
            Console.WriteLine("2) Find a CD");
            Console.WriteLine("3) Find an artist");
            Console.WriteLine("4) Log off");
            Console.Write("Choice: ");
            uI = Console.ReadLine();
            choice = Convert.ToInt32(uI);

            switch(choice)
            {
                case 1:
                    {
                        Console.Write("\nWhich CD do you want? ");
                        uI = Console.ReadLine();
                        arrInd = Convert.ToInt32(uI);

                        if (arrInd >= 1 || arrInd <= size)
                        {
                            Console.Write(arrInd + ". ");
                            cd1[(arrInd - 1)].printAudioCD();
                        }

                        break;
                    }
                case 2:
                    {
                        break;
                    }
                case 3:
                    {
                        break;
                    }
                case 4:
                    {
                        isPlaying = false;
                        break;
                    }
                default:
                    {
                        break;
                    }
            }


        }
    }
}

ВЫХОД Как вы видите в файле изображение. Выход должен быть, когда я ввожу 1 для выбора и 1 для компакт-диска, массив должен использовать массив для индекса 0, но он использует массив из последнего введенного компакт-диска. Вывод должен быть man1, man2 и man3, но это man4, man5 и man6.

Вы повторно используете один и тот же artistArray для каждой итерации, если только вам не нужно изменить его размер. Каждому компакт-диску нужен отдельный массив. (Я бы также предложил использовать List<T> вместо массивов, так что вам не нужно беспокоиться об изменении размера и т. д.)

Jon Skeet 23.04.2022 08:58

Спасибо. Теперь это имеет смысл, но я не уверен, как это реализовать. У меня сложилось впечатление, что у каждого из них, как у меня, должно быть свое, потому что artistArray - это просто временный массив, используемый для отправки этого массива в качестве параметра при создании нового класса. Нужно ли сбрасывать массив перед отправкой в ​​класс. Я посмотрю на использование списка, но я никогда не использовал их раньше.

Brandon Wright 23.04.2022 09:42

Нет, вам нужно создать массив новый. Я подозреваю, что вам нужно понимать разницу между ссылочными типами (включая массивы) и типами значений. См. jonsket.uk/csharp/references.html

Jon Skeet 23.04.2022 10:35

Спасибо за помощь. Я вроде как понимаю, почему это не работает, и мне нужно изучить это позже. Есть ли лучший способ делать то, что я делаю. Класс должен иметь в себе эти элементы, и единственная причина, по которой я сделал переменную класса, заключается в том, что если пользователь хочет ввести больше cd, он может это сделать.

Brandon Wright 23.04.2022 13:53

Да, было бы лучше использовать List<string>... и я бы также выделил "спросить пользователя о деталях компакт-диска" в качестве отдельного метода, который вы вызываете из Main... это, вероятно, сильно упростит ситуацию. Любые подробности, кроме этого, действительно выходят за рамки вопроса о переполнении стека...

Jon Skeet 23.04.2022 13:59
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
5
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете один и тот же массив в своем Main() для каждой итерации, и именно по этой причине вы получили исполнителей с последнего введенного компакт-диска. Я имею в виду этот фрагмент кода:

string[] artistArray = new string[4] {"", "", "", "" };

Здесь мы можем использовать List<T>, чтобы избежать написания кода изменения размера массива, и мы можем использовать метод Прозрачный(), чтобы не сохранять исполнителей с предыдущего компакт-диска.

Весь код будет выглядеть так. Я немного изменил ваш код, используя Список:

Класс AudioCD:

public class AudioCD
{
    // Private Variables for CDclass 
    public string cdTitle { get; private set; }

    private List<string> artists = new List<string>();
    public int releaseYear { get; private set; }
    public string genre { get; private set; }
    public float condition { get; private set; }

    // Constructor for the CDclass - initializes all variables used in the CDclass
    public AudioCD()
    {
        cdTitle = "";
        releaseYear = 1980;
        genre = "";
        condition = 0.0f;
    }

    // Overload Constructor for the CDclass - initializes all the variables to user input variables
    public AudioCD(string cdt, List<string> art, int reY, string gen, float con)
    {

        cdTitle = cdt;

        artists.AddRange(art);

        if (reY < 1980)
        {
            releaseYear = 1980;
        }
        else
        {
            releaseYear = reY;
        }
        genre = gen;
        if (con < 0.0f || con > 5.0f)
        {
            condition = 0.0f;
        }
        else
        {
            condition = con;
        }
    }

    public void printAudioCD()
    {
        Console.Write(cdTitle + ", " + releaseYear + "\n");
        for (int i = 0; i < artists.Count; i++)
        {
            if (artists[i] != "")
            {
                Console.WriteLine("Artist (#" + (i + 1) + "): " + artists[i]);
            }
        }
        Console.WriteLine("Genre: " + genre);
        Console.WriteLine("Condition: " + condition);
    }
}

и метод Main будет выглядеть так:

// variables
string uI, cdtitle, genre;
int size = 0, releaseYear, choice, arrInd;
List<string> artistArray = new List<string>();
float condition;

Console.Write("How many CDs do you have lying around your car? ");
uI = Console.ReadLine();
size = Convert.ToInt32(uI);

AudioCD[] cd1 = new AudioCD[size];

for (int i = 0; i < size; i++)
{
    Console.WriteLine("CD #" + (i + 1));
    Console.Write("*Enter Title: ");
    uI = Console.ReadLine();
    cdtitle = uI;

    Console.WriteLine("*Enter Artists (type -1 when finished):");
    int j = 0;
    do
    {
        uI = Console.ReadLine();
        if (uI != "-1")
            artistArray[j] = uI;
        j++;

    } while (uI != "-1");

    Console.Write("*Enter Genre: ");
    uI = Console.ReadLine();
    genre = uI;

    Console.Write("*Enter Release Year: ");
    uI = Console.ReadLine();
    releaseYear = Convert.ToInt32(uI);

    Console.Write("*Enter Condition: ");
    uI = Console.ReadLine();
    condition = float.Parse(uI);

    Console.Write("\n");

    // switch to select which class of cd to put information in
    cd1[i] = new AudioCD(cdtitle, artistArray, releaseYear, genre, condition);

    artistArray.Clear();
}

bool isPlaying = true;

while (isPlaying)
{
    Console.Write("\n");
    Console.WriteLine("[Main Menu]");
    Console.WriteLine("1) Album Info");
    Console.WriteLine("2) Find a CD");
    Console.WriteLine("3) Find an artist");
    Console.WriteLine("4) Log off");
    Console.Write("Choice: ");
    uI = Console.ReadLine();
    choice = Convert.ToInt32(uI);

    switch (choice)
    {
        case 1:
            {
                Console.Write("\nWhich CD do you want? ");
                uI = Console.ReadLine();
                arrInd = Convert.ToInt32(uI);

                if (arrInd >= 1 || arrInd <= size)
                {
                    Console.Write(arrInd + ". ");
                    cd1[(arrInd - 1)].printAudioCD();
                }

                break;
            }
        case 2:
            {
                break;
            }
        case 3:
            {
                break;
            }
        case 4:
            {
                isPlaying = false;
                break;
            }
        default:
            {
                break;
            }
    }
}

Другие вопросы по теме