Как отобразить это простое приложение C# на консоли?

class Program
{
    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader("input.txt");
        int lineCount = int.Parse(sr.ReadLine());

        List<string> materials = new List<string>();
        List<string> premiumMaterials = new List<string>();

        PremiumChocolateFactory premiumChocolate;
        ChocolateFactory chocolate;

        while (!sr.EndOfStream)
        {
            string[] line = sr.ReadLine().Split(';');

            for (int i = 2; i < line.Length - 1; i++)
            {
                if (line[line.Length - 1] == "premium")
                {
                    premiumMaterials.Add(line[i]);
                }
            }
            for (int i = 2; i < line.Length; i++)
            {
                if (!line.Contains("premium"))
                {
                    materials.Add(line[i]);
                }
            }

            premiumChocolate = new PremiumChocolateFactory(line[0], int.Parse(line[1]), premiumMaterials);
            chocolate = new ChocolateFactory(line[0], int.Parse(line[1]), materials);
            Console.WriteLine(premiumChocolate);
            Console.WriteLine(chocolate);
        }
    }
}

3

dark chocolate;81;cocoa;sugar;cocoa butter;premium  
milk chocolate;70;cocoa powder;cocoa butter;milk  
white chocolate;0;sugar;cocoa butter;milk

Файл "input.txt" содержит вышеуказанную информацию. Первая строка - это количество разных конфет, а остальное примерно так:
тип шоколада, количество какао, материалы (3 из них) и то, является ли шоколад премиальным.

Если это премиум, вы должны создать объект PremiumChocolateFactory, если нет, то просто обычный объект ChocolateFactory. Мой шоколадный предмет премиум-класса просто отлично смотрится на консоли, но обычные шоколадные конфеты перемешаны. PremiumChocolateFactory наследуется от ChocolateFactory. Я переопределил метод ToString в моем классе ChocolateFactory.

return $"Chocolate type: {chocolateType} | Materials: {string.Join(", ", material)} | Cocoa amount: {cocoaAmount}%";

Я знаю, что Console.WriteLines не должно быть внутри цикла while, но я получаю сообщение об ошибке, если они находятся вне lol.

введите описание изображения здесь

1 ответ

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

public class ChocolateFactory
{

    public string ChocolateType { get; set; }
    public int CocoaAmount { get; set; }
    public List<string> Materials {get;set;} = new List<string>();
    public override string ToString()
    {
        return $"Chocolate type: {ChocolateType} | Materials: {string.Join(", ", Materials)} | Cocoa amount: {CocoaAmount}%, IsPremium=No";

    }
}
public class PremiumChocolateFactory : ChocolateFactory
{
    public override string ToString()
    {
        return $"Chocolate type: {ChocolateType} | Materials: {string.Join(", ", Materials)} | Cocoa amount: {CocoaAmount}%, IsPremium=Yes";

    }
}

Итак, теперь у этих классов есть List<string> для материалов и, следовательно, нет необходимости иметь свои собственные списки в коде

List<ChocolateFactory> myChocos = new List<ChocolateFactory>();
using (StreamReader sr = new StreamReader(@"e:\temp\input.txt"))
{
    int lineCount = int.Parse(sr.ReadLine());

    while (!sr.EndOfStream)
    {
        string[] line = sr.ReadLine().Split(';');
        bool isPremium = line[line.Length - 1] == "premium";
        int length = isPremium ? line.Length - 1 : line.Length;

        var t = isPremium ? new PremiumChocolateFactory() 
                          : new ChocolateFactory();

        t.ChocolateType = line[0];
        t.CocoaAmount = Int32.Parse(line[1]);
        for (int i = 2; i < length; i++)
            t.Materials.Add(line[i]);
        myChocos.Add(t);
    }
}

....
foreach(var x in myChocos)
    Console.WriteLine(x);
Другие вопросы по тегам