using System.Collections.Generic;
public static void Main()
var skus = new List<Sku>();
skus.Add(new Sku(){ ID = 0, ProductID = 1 });
skus.Add(new Sku(){ ID = 1, ProductID = 1, Availability = ProductAvailability.InStock });
skus.Add(new Sku(){ ID = 2, ProductID = 2, Availability = ProductAvailability.InStock });
skus.Add(new Sku(){ ID = 3, ProductID = 1 });
skus.Add(new Sku(){ ID = 4, ProductID = 1 });
skus.Add(new Sku(){ ID = 5, ProductID = 2 });
skus.Add(new Sku(){ ID = 6, ProductID = 3 });
skus.Add(new Sku(){ ID = 7, ProductID = 4, Availability = ProductAvailability.InStock });
skus.Add(new Sku(){ ID = 8, ProductID = 3, Availability = ProductAvailability.InStock });
var orderedSkus = skus.OrderByDescending(o => GetInStock().Contains(o.Availability));
var products = GetProducts(orderedSkus);
public int ProductID {get;set;}
public ProductAvailability Availability {get; set;} = ProductAvailability.OutOfStock;
public ProductAvailability Availability {get; set;} = ProductAvailability.OutOfStock;
public int SkuID{get; set;}
public int ID {get; set;}
public static Func<IEnumerable<Sku>, IEnumerable<IGrouping<object, Sku>>> GroupSkus { get; set; } = sku => sku.GroupBy(o => (object)o.ProductID);
public static IEnumerable<Product> GetProducts(IEnumerable<Sku> skus) {
public static void Write(Product product){
Console.WriteLine(product.SkuID + " " + product.Availability);
public static void Write(IEnumerable<Product> products){
foreach (var product in products){
public static Product Map(IEnumerable<Sku> skus) {
var productVM = new Product();
var sku = SelectSku(skus);
productVM.Availability = sku.Availability;
productVM.ID = sku.ProductID;
productVM.SkuID = sku.ID;
protected static Sku SelectSku(IEnumerable<Sku> skus) {
.OrderByDescending(o => GetInStock().Contains(o.Availability))
public static IEnumerable<ProductAvailability> GetInStock() {
return new ProductAvailability[] {
ProductAvailability.InStock,
ProductAvailability.LastPieces,
ProductAvailability.InExternalStock,
public enum ProductAvailability : int {