2014-04-05 3 views
1

이 코드에 도움이 필요합니다. 코드를 실행하면 마지막 7 줄에 나타납니다 (... 에 대한 루프 ... 개체) Exercise.OrderItem. 문제는 OrderItem 개체에 액세스하려는 것입니다. .loop하지만 얻을 수있는 마지막 줄은 모두 입니다. OrderItem objects.How for ... for ... 루프를 사용하면 foreach ... 루프와 같은 결과를 얻을 수 있습니까? 인덱서와 관련이 있다고 생각합니다. 감사합니다. 정말 당신의 문제를 설명하기 위해 필요한 것보다 훨씬 더 많은 코드가다른 클래스의 객체에 액세스하는 연산자

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Collections; 

    namespace Exercise 
    { 
     interface IPricing 
     { 
      //read/write property 
      double Price 
      { 
       get; 
       set; 
      } 
      double Discount 
      { 
       get; 
       set; 
      } 
     } 
     public class Order:IPricing 
     { 
      private string name; 
      private double price; 
      private static int OrderNo; 
      //private ArrayList m_items = new ArrayList(); 
      private ArrayList m_items; 


      //static constructor 
      static Order() 
      { 
       OrderNo = 0; 
      } 

      //default constructor 
      public Order() 
      { 
       name = null; 
       price = 0; 
       OrderNo++; 
       m_items = new ArrayList(); 
      } 
      //constructor with parameters 
      public Order(string name, double price) 
      { 
       this.name = name; 
       this.price = price; 
       OrderNo++; 
       this.m_items = new ArrayList(); 
      } 
      //copy constructor 
      public Order(Order order) 
      { 
       this.name = order.name; 
       this.price = order.price; 
       this.m_items = order.m_items; 
      } 

      public string Name 
      { 
       get { return name; } 
       set { name = value; } 
      } 

      public IEnumerable Items 
      { 
       get { return m_items; } 
       private set { } 
      } 

      public void AddItem(OrderItem orderItem) 
      { 
       orderItem.Order = name; 
       m_items.Add(orderItem); 
      } 

      public static Order operator +(Order o1, Order o2) 
      { 
       Order o3 = new Order(o1.name+", "+o2.name,o1.price+o2.price); 
       o3.m_items.AddRange(o1.m_items); 
       o3.m_items.AddRange(o2.m_items); 
       return o3; 
      } 

      //indexer 
      public object this[int index] 
      { 
       get 
       { 
        m_items[index] = this.m_items[index]; 
        return m_items[index]; 
       } 
       set { m_items[index] = value; } 
      } 

      public double ItemCount 
      { 
       get { return m_items.Count; } 
       private set{} 
      } 


      public virtual void Print() 
      { 
       Console.WriteLine("*********************Order No. {0}***********************", OrderNo); 
       Console.WriteLine("Details"); 
       Console.WriteLine("Name:    {0}", name); 
       Console.WriteLine("Price:    {0}", price); 
      } 

      public double Price 
      { 
       get { return price - Discount; } 
       set { price = value; } 
      } 

      public virtual double Discount 
      { 
       get { return 0; } 
       set { ;} 
      } 

      public void PrintItems() 
      { 
       Console.WriteLine("Items in this order: "); 
       Console.WriteLine(); 
       foreach(OrderItem itm in this.m_items) 
       { 
        Console.WriteLine("Item name: {0,4};\tPart of order: {1}", itm.Name, itm.Order); 
       } 
      } 


} 

     public class OrderItem 
     { 
      private string m_name; //name of the item in order 
      private string m_order; //name of the order whose parts are items with names m_name 
      //default constructor 
      public OrderItem() 
      { 
       m_order = null; 
      } 
      //parameter constructor 
      public OrderItem(string name) 
      { 
       this.m_name = name; 
       this.m_order = null; 
      } 
      //copy constructor 
      public OrderItem(OrderItem orderItem) 
      { 
       this.m_name = orderItem.m_name; 
       this.m_order = orderItem.m_order; 
      } 

      //Name read/write property 
      public string Name 
      { 
       get { return m_name; } 
       set { m_name = value; } 
      } 

      //Order read/write property 
      public string Order 
      { 
       get { return m_order; } 
       set { m_order = value; } 
      } 
     } 

     public class MainProgram 
     { 
      static void Main(string[] args) 
      { 
       string order1 = "Desktop PC"; 
       Order desktopPC = new Order(order1,25000); 
       desktopPC.AddItem(new OrderItem("pc mouse")); 
       desktopPC.AddItem(new OrderItem("keyboard")); 
       desktopPC.AddItem(new OrderItem("monitor")); 
       desktopPC.AddItem(new OrderItem("pc")); 

       desktopPC.Print(); 
       desktopPC.PrintItems(); 

       Console.WriteLine(); 


       string order2 = "Notebook"; 
       Order notebook = new Order(order2, 54000); 
       notebook.AddItem(new OrderItem("mouse")); 
       notebook.AddItem(new OrderItem("bag")); 
       notebook.AddItem(new OrderItem("notebook")); 


       notebook.Print(); 
       notebook.PrintItems(); 


       Console.WriteLine(); 
       Order total = desktopPC + notebook; 
       total.Print(); 
       total.PrintItems(); 
       Console.WriteLine(); 

       Console.WriteLine("Getting the items via for loop"); 
       for (int k = 0; k < total.ItemCount; k++) 
       { 
        Console.WriteLine(total[k]); 
       } 

        Console.ReadKey(); 
      } 
     } 
    } 
+2

. 관련없는 비트를 자르거나 대신 짧은 동등한 코드 조각을 게시하는 것이 좋습니다. – anaximander

+0

문제를 더 잘 설명해주세요. 질문이 무엇인지 실제로 알 수는 없습니다 ...주기에 대한 내용은 이해할 수있는 7 가지 항목을 반환해야합니다 ... 예상되는 출력은 무엇이고 실제 출력은 무엇입니까? ? –

+0

@anaximander : 죄송합니다. 모든 것을 보는데 도움이 될 것이라고 생각했습니다. –

답변

1
 for (int k = 0; k < total.ItemCount; k++) 
     { 
      var x = total[k] as OrderItem; 
      if (x == null) continue; 
      Console.WriteLine(x.Name); 
      Console.WriteLine(x.Order); 
     } 
+0

예, 작동합니다. 그럼에도 불구하고 나는 C#의 초심자이기 때문에 사이클의 첫 번째 줄을 이해하지 못한다. 설명해 주시겠습니까? –

+0

나를 도와 주셔서 감사합니다. @Chris가 그의 첫 번째 논평에서 말했듯이 이것은 단순한 주조 일뿐입니다. –

+1

@ Mikee.Cara : 첫 번째 줄은 일종의 조건부 주조입니다. 'as '연산자는 객체를 그 타입으로 변환하려고합니다. 성공하면 해당 객체를 적절하게 형 변환하고, 형 변환에 실패하면 null을 대신 반환합니다. 이 경우'total [k]'가 항상'OrderItem' 유형이라는 것을 알아야하므로 조건이 필요하지 않습니다. 이벤트에서 OrderItem이 아닌 무언가를 얻었을 때 아마 뭔가 다른 곳에서 잘못되었다는 것을 나타내는 것일 수 있습니다. 따라서 예외가 아마 여기에서 원하는 것일 수 있습니다. – Chris

관련 문제