using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class Order
{
public DateTime Date { get; set; }
public int Id { get; set; }
}
public class OrderDateSummary {
public DateTime Date { get; set; }
public int Total { get; set; }
}
public class Test
{
public static void Main()
{
DateTime start = new DateTime(2016, 1, 1);
DateTime end = new DateTime(2016, 1, 4);
List<Order> orderList = new List<Order>()
{
new Order() { Date = new DateTime(2016, 1, 1, 10, 10, 10), Id = 1 },
new Order() { Date = new DateTime(2016, 1, 1, 12, 10, 10), Id = 2 },
new Order() { Date = new DateTime(2016, 1, 1, 0, 10, 10), Id = 3 },
new Order() { Date = new DateTime(2016, 1, 2, 1, 10, 4), Id = 4 },
new Order() { Date = new DateTime(2016, 1, 2, 2, 4, 2), Id = 5 },
new Order() { Date = new DateTime(2016, 1, 4, 1, 0, 4), Id = 6 },
new Order() { Date = new DateTime(2016, 1, 4, 1, 3, 3), Id = 7 },
new Order() { Date = new DateTime(2016, 1, 4, 2, 2, 2), Id = 8 },
};
var res = Enumerable
.Range(0, 1 + (end - start).Days)
.Select(x => start.AddDays(x))
.GroupJoin(orderList,
dt => dt, o => o.Date.Date,
(dt, orders) => new OrderDateSummary { Date = dt, Total = orders.Count() })
.ToList();
foreach(var ods in res)
Console.WriteLine("{0} - {1}", ods.Date, ods.Total);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCnB1YmxpYyBjbGFzcyBPcmRlcgp7CiAgICBwdWJsaWMgRGF0ZVRpbWUgRGF0ZSB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgaW50IElkIHsgZ2V0OyBzZXQ7IH0KfQoKcHVibGljIGNsYXNzIE9yZGVyRGF0ZVN1bW1hcnkgewogICAgcHVibGljIERhdGVUaW1lIERhdGUgeyBnZXQ7IHNldDsgfQogICAgcHVibGljIGludCBUb3RhbCB7IGdldDsgc2V0OyB9Cn0KCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKICAgICAgICBEYXRlVGltZSBzdGFydCA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCAxKTsKICAgICAgICBEYXRlVGltZSBlbmQgPSBuZXcgRGF0ZVRpbWUoMjAxNiwgMSwgNCk7CiAgICAgICAgCiAgICAgICAgTGlzdDxPcmRlcj4gb3JkZXJMaXN0ID0gbmV3IExpc3Q8T3JkZXI+KCkKICAgICAgICB7CiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCAxLCAxMCwgMTAsIDEwKSwgSWQgPSAxIH0sCiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCAxLCAxMiwgMTAsIDEwKSwgSWQgPSAyIH0sCiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCAxLCAwLCAxMCwgMTApLCBJZCA9IDMgfSwKICAgICAgICAgICAgbmV3IE9yZGVyKCkgeyBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTYsIDEsIDIsIDEsIDEwLCA0KSwgSWQgPSA0IH0sCiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCAyLCAyLCA0LCAyKSwgSWQgPSA1IH0sCiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCA0LCAxLCAwLCA0KSwgSWQgPSA2IH0sCiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCA0LCAxLCAzLCAzKSwgSWQgPSA3IH0sCiAgICAgICAgICAgIG5ldyBPcmRlcigpIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE2LCAxLCA0LCAyLCAyLCAyKSwgSWQgPSA4IH0sCiAgICAgICAgfTsKCiAgICAgICAgdmFyIHJlcyA9IEVudW1lcmFibGUKICAgICAgICAgICAgLlJhbmdlKDAsIDEgKyAoZW5kIC0gc3RhcnQpLkRheXMpCiAgICAgICAgICAgIC5TZWxlY3QoeCA9PiBzdGFydC5BZGREYXlzKHgpKQogICAgICAgICAgICAuR3JvdXBKb2luKG9yZGVyTGlzdCwKICAgICAgICAgICAgICAgIGR0ID0+IGR0LCBvID0+IG8uRGF0ZS5EYXRlLAogICAgICAgICAgICAgICAgKGR0LCBvcmRlcnMpID0+IG5ldyBPcmRlckRhdGVTdW1tYXJ5IHsgRGF0ZSA9IGR0LCBUb3RhbCA9IG9yZGVycy5Db3VudCgpIH0pCiAgICAgICAgICAgIC5Ub0xpc3QoKTsKICAgICAgICAgICAgCiAgICAgICAgZm9yZWFjaCh2YXIgb2RzIGluIHJlcykKICAgICAgICAJQ29uc29sZS5Xcml0ZUxpbmUoInswfSAtIHsxfSIsIG9kcy5EYXRlLCBvZHMuVG90YWwpOwoJfQp9