Создайте список объектов и отобразите их в консоли через другой класс

#c# #list

#c# #Список

Вопрос:

Для домашнего задания мне нужно создать List<T> , добавить в него объекты и отобразить объекты в строку. Вот что у меня есть:

 public class Order
{
    ...
      public List<OrderLine> orderLines;
      public Order(User user1)
      {
          ...
          orderLines = new List<OrderLine>();
      }

      public void AddOrderLine(OrderLine newOrderLine)
      {
          orderLines.Add(newOrderLine);
      }
}

public class OrderLine
{
   public OrderLine(Product p1, int q1)
   {
      ...
   }
   public override string ToString() //Required by teacher
   {
      string myOrderLine;
      myOrderLine = String.Format("[Product name: {0}; Price: {1}; Quantity: {2}]", 
         product.name, product.price, quantity);
      return myOrderLine;
   }
}
  

При добавлении дополнительных строк.Добавить (новую строку) новая строка заказа — это объект, созданный в другом классе, который имеет рабочую строку. Как мне отобразить все новые строки из Program.CS?

Ответ №1:

Я предполагаю, что ваш основной метод выглядит примерно так:

 {    
   User user = new User();    
   Order order = new Order(user);   
   OrderLine orderLine1 = new OrderLine();   
   order.AddOrderLine(orderLine1); 
}
  

Если я правильно понимаю, что вы говорите, OrderLine уже переопределяет toString() , так что при вызове toString() он возвращает что-то «значимое для человека». В этом случае единственное, что вам нужно сделать, это что-то вроде

 foreach (var orderLine in order.orderLines)
{
    Console.WriteLine(orderLine.ToString());
}
  

Обратите внимание, что считается хорошей практикой не публиковать поля, например, OrderLines . Лучше сделайте его закрытым и создайте общедоступное свойство, например:

 public IEnumerable<OrderLine> OrderLines
{
   get { return this.orderLines; }
}
  

Комментарии:

1. Вы правы с методом main, однако for each не работает. Я попробую изучить IEnumerable .. новичок в этом и еще не слышал об этом. Спасибо!

2. Должен ли я сделать это общедоступным свойством в программе. CS или Order.CS?

3. В Order.cs. Заказ отвечает за предоставление списка строк заказа своим потребителям через его общедоступное свойство. Он поддерживается закрытым полем, о котором никто другой не должен знать. Таким образом, вы можете сохранить общедоступный API таким же (общедоступное свойство), но реорганизовать «внутренности» Order любым способом, который вы считаете нужным.

4. Foreach должен работать; вы вставили в метод Main консольного приложения?

5. Вам не обязательно использовать IEnumerable, вы также можете возвращать List . Причина, по которой я это сделал, заключается в том, что IEnumerable является более общим; Список обещает пользователю, что элементы находятся в определенном порядке, и что вы можете добавлять или удалять. IEnumerable просто обещает, что элементы могут быть повторены. Таким образом, общедоступный интерфейс менее специфичен, вы даете «узкое» обещание другим классам, которые будут использовать Order , и у вас потенциально меньше возможностей для поддержки с течением времени (т. Е. Меньше потенциальных ошибок!).).

Ответ №2:

Предполагая, что у вас есть рабочий .ToString() класс OrderLine. Если вы просто хотите отобразить их на консоли, вы можете сделать простой:

 foreach(OrderLine orderline in orderLines)
   System.Console.WriteLine(orderline.ToString());
  

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

Два простых способа сделать это — либо так, как Матиас изложил довольно красиво, либо поместить мой код в ваш Order класс. Например, добавьте новый метод, подобный этому:

 public void PrintOrders()
{
    foreach(OrderLine orderline in this.orderLines)
       System.Console.WriteLine(orderline.ToString());  
}
  

Вы бы использовали его как:

 User user = new User();    
Order order = new Order(user);   
OrderLine orderLine = new OrderLine();
order.AddOrderLine(orderLine);
order.PrintOrders();
  

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

Комментарии:

1. Строки порядка не существуют в текущем контексте (для строк порядка)

2. @Troy, OrderLines существует внутри Order класса. Так что вам придется либо использовать orderObj.orderLines внутри основного файла program.cs (или аналогичного местоположения), либо поместить мой код внутри Order класса. Я добавлю пример.

Ответ №3:

если у вас есть что-то подобное в вашем Program.cs для заполнения вашего объекта Order

 var order = new Order();
order.AddOrderLine(...);

//this is how you can display each item ToString in the collection
foreach(var o in order.orderLines)
{
   Console.WriteLine(o.ToString());
}
  

просто проверьте, нет ли опечаток или синтаксических ошибок, поскольку я ввел это здесь только встроенным

Ответ №4:

Это то, что вам нужно?

 public static void Main(string[] args)
{
    Order order = new Order();

    OrderLine line1 = new OrderLine(...);
    OrderLine line2 = new OrderLine(...);
    OrderLine line3 = new OrderLine(...);

    order.AddOrderLine(line1);
    order.AddOrderLine(line2);
    order.AddOrderLine(line3);

    foreach (OrderLine line in order.orderLines)
    {
        Console.WriteLine(line.ToString());
    }
}
  

Комментарии:

1. Я пробовал это. Выдает мне «Ссылка на объект требуется для нестатического поля, метода или свойства ConsoleApplication1. Order.OrderLines’