IEnumerable GroupBy Part 1

I was tasked to group some data that had duplicate keys. The data was good as it was line items that came in as partial records. This resulted in some Dictionary Add row logic to fail. Working with a colleague we came up with a IEnumerable GroupBy extension method that I have found very interesting, useful, and something I don’t want to forget so I’m posting it here.

    internal class Program
    {
        static void Main(string[] args)
        {
            var list = new List<OrderDetail>
            {
                new OrderDetail { OrderNumber = "1", ItemNumber = "1", LineNumber = 1, Quantity = 5 },
                new OrderDetail { OrderNumber = "1", ItemNumber = "1", LineNumber = 1, Quantity = 5 },
                new OrderDetail { OrderNumber = "2", ItemNumber = "1", LineNumber = 1, Quantity = 5 },
                new OrderDetail { OrderNumber = "2", ItemNumber = "1", LineNumber = 1, Quantity = 5 },
                new OrderDetail { OrderNumber = "3", ItemNumber = "1", LineNumber = 1, Quantity = 5 },
                new OrderDetail { OrderNumber = "3", ItemNumber = "2", LineNumber = 1, Quantity = 5 },
            };
            var summary = list.ToOrderDetailGrouped();
        }
    }
    internal class OrderDetail
    {
        public OrderDetail()
        {

        }

        public OrderDetail(OrderDetail orderDetail, int quantity) 
        {
            OrderNumber = orderDetail.OrderNumber;
            ItemNumber = orderDetail.ItemNumber;
            LineNumber = orderDetail.LineNumber;
            Quantity = orderDetail.Quantity;
            Quantity = quantity;    
        }

        public string OrderNumber { get; set; }
        public string ItemNumber { get; set; }
        public int LineNumber { get; set; }
        public int Quantity { get; set; }
    }
    static class ExtensionMethods
    {
        public static IEnumerable<OrderDetail> ToOrderDetailGrouped(this IEnumerable<OrderDetail> items)
        {
            return items.GroupBy(orderDetail => new { orderDetail.OrderNumber, orderDetail.ItemNumber, orderDetail.LineNumber })
                .Select(orderDetailGrouped => new OrderDetail(orderDetailGrouped.First(),
                orderDetailGrouped.Sum(i => i.Quantity)));
        }
    }

Leave a comment