using System.Collections.Generic;
public int Id { get; set; }
public int StudentId { get; set; }
public string Subject { get; set; }
public double Score { get; set; }
public override string ToString() => $"Id: {Id} StudentId: {StudentId} Subject {Subject} Score {Score}";
public static void Main()
new ScoreInfo {Id = 1, StudentId = 1, Subject = "GK", Score = 90},
new ScoreInfo {Id = 2, StudentId = 1, Subject = "PHY", Score = 97},
new ScoreInfo {Id = 3, StudentId = 1, Subject = "CHE", Score = 89},
new ScoreInfo {Id = 4, StudentId = 1, Subject = "BIO", Score = 93},
new ScoreInfo {Id = 5, StudentId = 1, Subject = "TAM", Score = 100},
new ScoreInfo {Id = 6, StudentId = 1, Subject = "ENG", Score = 95},
new ScoreInfo {Id = 7, StudentId = 2, Subject = "GK", Score = 85},
new ScoreInfo {Id = 8, StudentId = 2, Subject = "PHY", Score = 76},
new ScoreInfo {Id = 9, StudentId = 2, Subject = "CHE", Score = 63},
new ScoreInfo {Id = 10, StudentId = 2, Subject = "BIO", Score = 79},
new ScoreInfo {Id = 11, StudentId = 2, Subject = "TAM", Score = 61},
new ScoreInfo {Id = 12, StudentId = 2, Subject = "ENG", Score = 60}
var scienceSubjects = new HashSet<string> { "GK", "PHY", "CHE", "BIO" };
var resultQuery = scoreInfos.Select(scoreInfo => new
GrpId = scienceSubjects.Contains(scoreInfo.Subject) ? 0 : 1
.OrderByDescending(x => x.GrpId)
.ThenByDescending(x => x.ScoreInfo.Score)
.Select(x => x.ScoreInfo)
foreach(var scoreInfo in resultQuery)
Console.WriteLine(scoreInfo);