using System.Collections.Generic;
public static void Main()
var candidateShifts = new List<AvailabilityPreference>();
candidateShifts.Add(new AvailabilityPreference{CandidateId = 1, DayOfWeek = 0, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 1, DayOfWeek = 1, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 2, DayOfWeek = 0, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 2, DayOfWeek = 1, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 2, DayOfWeek = 2, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 3, DayOfWeek = 0, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 3, DayOfWeek = 1, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 4, DayOfWeek = 1, ShiftTime = "10-12"});
candidateShifts.Add(new AvailabilityPreference{CandidateId = 5, DayOfWeek = 2, ShiftTime = "10-12"});
var groupedShifts = from pref in candidateShifts group new {pref.DayOfWeek, pref.ShiftTime} by pref.CandidateId
into result select new { CandidateId = result.Key, ShiftDetails = result.ToList()};
foreach(var x in groupedShifts.ToList())
Console.WriteLine(x.CandidateId.ToString() +"-"+ x.ShiftDetails.Count().ToString());
foreach(var y in x.ShiftDetails)
Console.WriteLine(y.DayOfWeek.ToString()+ "-" + y.ShiftTime);
public class AvailabilityPreference
public int CandidateId {get; set;}
public int DayOfWeek {get; set;}
public string ShiftTime {get; set;}