using System.Collections.Generic;
using System.Collections.ObjectModel;
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 List<OrderItem> _orderItems = new List<OrderItem>();
public IReadOnlyList<OrderItem> OrderItems
return new ReadOnlyCollection<OrderItem>(_orderItems);
public void AddRange(IEnumerable<OrderItem> orderItems)
_orderItems.AddRange(orderItems);
public static void Main()
order.AddRange(new 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)
Display("Order #1", order);
var item = order.OrderItems.SingleOrDefault(x => x.PartNumber == 111033401);
Console.WriteLine("Order #1 has #111033401 item - price is {0:###,###.00}$.\n", item.UnitPrice * item.Quantity);
Console.WriteLine("Order #1 doesn't have #111033401 item.\n");
order.AddRange(new OrderItem[]
new OrderItem(111033401, "Nut", 10, .5),
new OrderItem(127700026, "Crank", 27, 5.98)
Display("Order #2", order);
item = order.OrderItems.SingleOrDefault(x => x.PartNumber == 127700026);
Console.WriteLine("Order #2 has #127700026 item - price is {0:###,###.00}$.\n", item.UnitPrice * item.Quantity);
Console.WriteLine("Order #2 doesn't have #127700026 item.\n");
private static void Display(string title, Order order)
Console.WriteLine(title);
foreach (OrderItem item in order.OrderItems)