У меня есть список в одном классе, и у меня возникают проблемы с доступом к нему из другого класса C# - PullRequest
0 голосов
/ 25 апреля 2020

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

Это код для одного из классов еды:

public class Soup : Food
{
    public List<Soup> soups = new List<Soup>();
    public Soup(string name, double grams, decimal price) : base(name, grams, price)
    {
    }
}

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

int countProducts = int.Parse(Console.ReadLine());
char[] delimeters = new char[] { ',', ' ' };
CultureInfo cultures = new CultureInfo("en-US");
for (int i = 0; i < countProducts; i++)
{
    string[] inputProductInfo = Console.ReadLine().ToLower().Split(delimeters, StringSplitOptions.RemoveEmptyEntries).ToArray();
    if (inputProductInfo[0] == "soup")
    {
        Soup soup = new Soup(inputProductInfo[1], Convert.ToDouble(inputProductInfo[2], cultures), Convert.ToDecimal(inputProductInfo[3], cultures));
    }
}

В принципе, мне нужно дать soup в список soups, но когда я пытаюсь использовать следующий код soups.Add(soup), я получаю

Имя «супы» не существует в текущем контексте ошибки.

РЕДАКТИРОВАТЬ: Оставьте это редактирование здесь, если у кого-то возникнет та же проблема через некоторое время Я проверил оба предложения ниже, и оба они работали на меня. Однако я выбрал второй предложенный способ li223 , поскольку это было именно то, что я искал. И совет для изменения кода был также полезен.

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Подход к элементу stati c, вероятно, имеет смысл, но не совсем понятен из описания проблемы.

Вы можете просто добавить Суп в список stati c из конструктора. тогда вам не нужно беспокоиться о добавлении его извне; каждый созданный суп добавляется!

public class Soup : Food
{
    public static List<Soup> soups = new List<Soup>();
    public Soup(string name, double grams, decimal price) : base(name, grams, price)
    {
        soups.Add(this);
    }
}

Затем получите доступ к вашему списку с помощью:

Soup.soups.xxx();
1 голос
/ 25 апреля 2020

Вам нужно как-то ссылаться на список из вашего другого объекта. Вы не можете просто указать имя участника. Есть 2 способа сделать это.

Статически: Вы можете создать список в классе Soup stati c, который позволит вам Soup.soups

public class Soup : Food
{
    public static List<Soup> soups = new List<Soup>();
}
var mysoup = new Soup(/*removed for brevity*/);
Soup.soups.Add(mysoup);

или Вы можете создать экземпляр своего класса Soup и получить доступ к члену таким образом, что в любом случае почти то, что вы сделали:

public class Soup : Food
{
    public List<Soup> soups = new List<Soup>();
}
var mysoupobj = new Soup(/*data*/);
mysoupobj.soups.Add(soup);

Редактировать:

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

...