using System.Collections.Generic;
using System.Collections.ObjectModel;
public class OrderItemCollection : Collection<OrderItem>
public event EventHandler<OrderItemAddedEventArgs> OrderItemAdded = delegate { };
public event EventHandler<OrderItemRemovedEventArgs> OrderItemRemoved = delegate { };
public OrderItemCollection()
public OrderItemCollection(IList<OrderItem> list) : base(list)
throw new ArgumentNullException("value");
foreach(var item in list.ToList())
protected override void InsertItem(int index, OrderItem newItem)
base.InsertItem(index, newItem);
if (OrderItemAdded != null)
OrderItemAdded.Invoke(this, new OrderItemAddedEventArgs(newItem));
protected override void RemoveItem(int index)
OrderItem item = Items[index];
if (OrderItemAdded != null)
OrderItemRemoved.Invoke(this, new OrderItemRemovedEventArgs(item));
public class OrderItemAddedEventArgs : EventArgs
public OrderItemAddedEventArgs(OrderItem item)
throw new ArgumentNullException("item is null!");
public OrderItem OrderItem { get; private set; }
public class OrderItemRemovedEventArgs : EventArgs
public OrderItemRemovedEventArgs(OrderItem item)
throw new ArgumentNullException("item is null!");
public OrderItem OrderItem { get; private set; }
public readonly int PartNumber;
public readonly string Description;
public readonly double UnitPrice;
private int _quantity = 0;
public OrderItem(int partNumber, string description, int quantity, double unitPrice)
this.PartNumber = partNumber;
this.Description = description;
this.Quantity = quantity;
this.UnitPrice = unitPrice;
throw new ArgumentException("Quantity cannot be negative.");
public override string ToString()
return String.Format("{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}",
PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity);
private readonly OrderItemCollection _orderItems;
public OrderItemCollection OrderItems
public Order(IList<OrderItem> orderItems)
throw new ArgumentNullException("value");
this._orderItems = new OrderItemCollection(orderItems);
this._orderItems.OrderItemAdded += AddMessage;
this._orderItems.OrderItemRemoved += RemovedMessage;
public void Add(OrderItem item)
public void Remove(int partNumber)
OrderItem itemForRemoving = _orderItems.First(item => item.PartNumber == partNumber);
_orderItems.Remove(itemForRemoving);
private void AddMessage(object sender, OrderItemAddedEventArgs eventArgs)
Console.WriteLine("Item has added.");
private void RemovedMessage(object sender, OrderItemRemovedEventArgs eventArgs)
Console.WriteLine("Item has removed.");
public static void Main()
var orderItems = new List<OrderItem>
new OrderItem(110072674, "Widget", 400, 45.17),
new OrderItem(110072675, "Sprocket", 27, 5.3),
new OrderItem(101030411, "Motor", 10, 237.5),
new OrderItem(110072684, "Gear", 175, 5.17)
var order = new Order(orderItems);
Display("Order #1", order);
if (!order.OrderItems.Any(item => item.PartNumber == 111033401))
Console.WriteLine("Order #1 doesn't have #111033401 item.\n");
order.Add(new OrderItem(111033401, "Nut", 10, .5));
order.Add(new OrderItem(127700026, "Crank", 27, 5.98));
Display("Order #2", order);
if (order.OrderItems.Any(item => item.PartNumber == 127700026))
Console.WriteLine("Order #2 has #127700026 item.");
private static void Display(string title, Order order)
Console.WriteLine(title);
foreach (OrderItem item in order.OrderItems)