I use the below code to sort `List<DataAccessViewModel>` list. Here is the sort order : 1. `PriorityScore` 2. `MName` 3. `CName` 4. `FName` It works as expected. public int Compare(DataAccessViewModel x, DataAccessViewModel y) { if (x == null || y == null) { return 0; } return x.CompareTo(y); } public int CompareTo(DataAccessViewModel mod) { int retval = (int)(this.PriorityScore?.CompareTo(mod.PriorityScore)); if(retval != 0) return retval; else { retval = (this.MName ?? "zzzzzzzzzzzzz").CompareTo(mod.MName ?? "zzzzzzzzzzzzz"); if (retval != 0) return retval; else { retval = (this.CName ?? "zzzzzzzzzzzzz").CompareTo(this.CName ?? "zzzzzzzzzzzzz"); if (retval != 0) return retval; else retval = (this.FName ?? "zzzzzzzzzzzzz").CompareTo(this.FName ?? "zzzzzzzzzzzzz"); } } return retval; } But the code looks clunky to me. Is there any better way of doing it or is this it ? Edit: here is the DataAccessViewModel with relevant properties public class DataAccessViewModel : IComparer<DataAccessViewModel> { public string CName { get; set; } public string MName { get; set; } public string FName { get; set; } public int? PriorityScore { get; set; } }