record UserEvent(EventType EventType, int UserId, int TimeStamp);
public static void Main()
var events = new UserEvent[] {
new(EventType.SessionStart, 1, 0001),
new(EventType.SessionEnd, 1, 0002),
new(EventType.SessionStart, 2, 0003),
new(EventType.SessionEnd, 2, 0004),
new(EventType.SessionStart, 3, 0005),
new(EventType.SessionEnd, 3, 0006),
new(EventType.SessionStart, 1, 0007),
new(EventType.SessionStart, 2, 0008),
new(EventType.SessionEnd, 1, 0009),
new(EventType.SessionEnd, 2, 0010),
var wantedUserIds = new int[] { 1, 2 };
var recentLoginsOriginal = events
.Where(e => e.EventType == EventType.SessionStart && wantedUserIds.Contains(e.UserId))
.OrderByDescending(e => e.TimeStamp)
.DistinctBy(e => e.UserId);
var recentLoginsNew = events
.Where(e => e.EventType == EventType.SessionStart && wantedUserIds.Contains(e.UserId))
.Select(eGroup => eGroup.OrderByDescending(e => e.TimeStamp).First());
Console.WriteLine(string.Join("\n", recentLoginsOriginal));
Console.WriteLine(string.Join("\n", recentLoginsNew));