List <EventsThreadRow> SortRows(List <EventsThreadRow> threads) { List <EventsThreadGroup> groups = new List <EventsThreadGroup>(); foreach (EventsThreadRow thread in threads) { EventsThreadGroup outputGroup = null; foreach (EventsThreadGroup group in groups) { if (group.IsMatch(thread)) { outputGroup = group; break; } } if (outputGroup == null) { outputGroup = new EventsThreadGroup(); groups.Add(outputGroup); } outputGroup.Threads.Add(thread); } List <EventsThreadRow> result = new List <EventsThreadRow>(); groups.ForEach(g => g.Sort()); groups.Sort(); foreach (var group in groups) { result.AddRange(group.Threads); } return(result); }