Как отобразить это простое приложение 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);