da się tu zrobić więcej LINQ np. zamieniając fora na IENumerable.Range i tam robiąc selecty itd, ale zostawiłem fora.
chyba działa ;)
public class DataWithSum
{
public DateTime Date { get; set; }
public int? Sum { get; set; }
public string DayName => Date.DayOfWeek.ToString();
}
public class Data
{
public DateTime Date { get; set; }
public int Value { get; set; }
}
public static List<DataWithSum> ProcessData(List<Data> data)
{
if (data.Select(x => x.Date.Month).Distinct().Count() != 1)
throw new Exception("data should be just from 1 month");
var firstDate = data.First().Date; // wypadałoby sprawdzić czy są dane :>
var daysCount = DateTime.DaysInMonth(firstDate.Year, firstDate.Month);
var output = new List<DataWithSum>();
for (int i = 1; i <= daysCount; i++)
{
var date = new DateTime(firstDate.Year, firstDate.Month, i);
output.Add(new DataWithSum { Date = date });
}
var groups = data.GroupBy(x => x.Date.Date).ToList(); // istotne jest to .Date.Date - A new object with the same date as this instance, and the time value set to 12:00:00 midnight (00:00:00).
foreach (var group in groups)
{
var dayToOverwrite = output.First(d => d.Date == group.Key.Date);
dayToOverwrite.Sum = group.Sum(x => x.Value);
}
return output;
}
public static void Main()
{
var data = new List<Data>
{
new Data { Date = DateTime.Now.AddDays(-24), Value = 35 },
new Data { Date = DateTime.Now.AddDays(-24), Value = 15 },
new Data { Date = DateTime.Now.AddDays(-28), Value = 4 }
};
var result = ProcessData(data);
foreach (var entry in result)
{
Console.WriteLine($"{entry.Date} {(entry.Sum?.ToString() ?? "NULL")} {entry.DayName}");
}
}
01.06.2022 00:00:00 NULL Wednesday
02.06.2022 00:00:00 4 Thursday
03.06.2022 00:00:00 NULL Friday
04.06.2022 00:00:00 NULL Saturday
05.06.2022 00:00:00 NULL Sunday
06.06.2022 00:00:00 50 Monday
07.06.2022 00:00:00 NULL Tuesday
08.06.2022 00:00:00 NULL Wednesday
09.06.2022 00:00:00 NULL Thursday
10.06.2022 00:00:00 NULL Friday
11.06.2022 00:00:00 NULL Saturday
12.06.2022 00:00:00 NULL Sunday
13.06.2022 00:00:00 NULL Monday
14.06.2022 00:00:00 NULL Tuesday
15.06.2022 00:00:00 NULL Wednesday
16.06.2022 00:00:00 NULL Thursday
17.06.2022 00:00:00 NULL Friday
18.06.2022 00:00:00 NULL Saturday
19.06.2022 00:00:00 NULL Sunday
20.06.2022 00:00:00 NULL Monday
21.06.2022 00:00:00 NULL Tuesday
22.06.2022 00:00:00 NULL Wednesday
23.06.2022 00:00:00 NULL Thursday
24.06.2022 00:00:00 NULL Friday
25.06.2022 00:00:00 NULL Saturday
26.06.2022 00:00:00 NULL Sunday
27.06.2022 00:00:00 NULL Monday
28.06.2022 00:00:00 NULL Tuesday
29.06.2022 00:00:00 NULL Wednesday
30.06.2022 00:00:00 NULL Thursday