using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
public enum AlarmSeverityLevel
ReallyReallyReallyBad = 3,
public static void Main()
var stopwatch = new Stopwatch();
Foo((o) => {count += o.Count;});
var timeSpan = stopwatch.Elapsed;
Console.WriteLine("Total elapsed Timespan = {0}, count = {1}", timeSpan, count);
static void Foo(Action<IList> businessLogicFunction)
var alarms = from healthIssue in _context.HealthIssues.AsNoTracking()
join asset in _context.Assets.AsNoTracking() on healthIssue.AssetNumber equals asset.SerialNumber into joinedTable
from data in joinedTable.DefaultIfEmpty()
var alarmsViewModelList = await alarms.ToListAsync();
var alarms = Enumerable.Range(0, 30000).Select(i =>
AssetNumber = 202 + (i % 12000),
Crew = "no idea what this is",
AlarmSeverityLevel = (AlarmSeverityLevel)((i + 1) % 5),
AlarmLastUpdatedTime = 10101L + i,
var alarmsViewModelList = alarms.ToList();
var groupedData = alarmsViewModelList
.Where(c => c.AlarmSeverityLevel != AlarmSeverityLevel.Unknown)
.GroupBy(c => new { c.AssetNumber, c.AlarmName })
.Select(g => g.Select(c =>
AlarmLastUpdateDateTime = DateTimeHelpers.FromEpochSecondsUTC(c.AlarmLastUpdatedTime),
AlarmSeverityLevel = c.AlarmSeverityLevel,
}).OrderByDescending(c =>c.AlarmLastUpdateDateTime).ToList())
.Where(l => l.Count > 0);
foreach (var alarmList in groupedData)
businessLogicFunction(alarmList);
public static class DateTimeHelpers
public static DateTime FromEpochSecondsUTC(long seconds) => DateTime.UtcNow;