public Task <Report> AddReport(Report report) { List <Event> events = (from e in GetEvents() where e.StartTime <= report.Time.AddMinutes(10) && e.EndTime >= report.Time.AddMinutes(-10) select e).ToList(); if (events.Count == 1) { if (report.Time < events[0].StartTime) { events[0].StartTime = report.Time; UpdateEvent(events[0]); } else if (report.Time > events[0].EndTime) { events[0].EndTime = report.Time; UpdateEvent(events[0]); } report.Event = events[0]; } else if (events.Count > 1) { Event closestEvent = events[0]; // base case double tmpInterval, minInterval = Math.Abs((report.Time - closestEvent.StartTime).TotalMinutes); foreach (Event ev in events) // check closest start time { tmpInterval = Math.Abs((report.Time - ev.StartTime).TotalMinutes); if (tmpInterval < minInterval) { minInterval = tmpInterval; closestEvent = ev; } } foreach (Event ev in events) // check closest end time { tmpInterval = Math.Abs((report.Time - ev.EndTime).TotalMinutes); if (tmpInterval < minInterval) { minInterval = tmpInterval; closestEvent = ev; } } report.Event = closestEvent; } else { report.Event = new Event(report.Time) { StartTime = report.Time }; } var res = _dal.AddReport(report); UpdateExplosions(report); return(res); }