} // happy bastard injection Saturday! public IReadOnlyCollection <IShoppingCart> Run(IReadOnlyCollection <IItem> items) { if (items.Count == 0) { return(new IShoppingCart[0]); } var orderItems = new LinkedList <IItem>(items.OrderByDescending(item => item.AreaRequired)); var result = new List <IShoppingCart>(); var currentItems = new List <IItem> { orderItems.First.Value }; orderItems.RemoveFirst(); do { var iterItem = orderItems.First; while (iterItem != null) { var test = new List <IItem>(currentItems) { iterItem.Value }; if (shoppingCartValidator.IsValid(test)) { currentItems.Add(iterItem.Value); // meh, was hoping we could just re-assign some pointers. Oh well var next = iterItem.Next; orderItems.Remove(iterItem); iterItem = next; } else { iterItem = iterItem.Next; } } result.Add(new ShoppingCart(currentItems)); if (orderItems.First != null) { currentItems = new List <IItem> { orderItems.First.Value }; orderItems.RemoveFirst(); } } while (orderItems.Any()); return(result); }