2017-08-17 10 views
1
var MaleCount = students.Where(Std => Std.Gender.ToUpper() == "M").Count(); 
var FemaleCount = students.Where(Std => Std.Gender.ToUpper() == "F").Count(); 

//List for storing top students records   
List<StudentEntity> TopStudents = new List<StudentEntity>(); 

//Adding records to List 
if (MaleCount > 0) 
{ 
    var maxMarksM = students.Where(o => o.Gender.ToUpper() == "M").Max(o => o.Marks); 
    TopStudents = students.Where(o => o.Gender.ToUpper() == "M" && o.Marks == maxMarksM).ToList(); 
} 
if (FemaleCount > 0) 
{ 
    var maxMarksF = students.Where(o => o.Gender.ToUpper() == "F").Max(o => o.Marks); 
    TopStudents.AddRange(students.Where(o => o.Gender.ToUpper() == "F" && o.Marks == maxMarksF).ToList()); 
} 

return TopStudents; 
+0

少なくとも、あなたは...(MaleCountとFemaleCount)...カウント – Spawn

答えて

0

免責事項を:それは問題だ 場合は、これを行うことができます。あなたは多分そのように連鎖し.GroupBy().Where()...ソリューションを使用したくない場合は

maleStudentsfemaleStudents

スプリットstudentsを(Where()を使用)。

これは、ifラッパーの必要性を排除し、男性と女性の生徒の行の周りのCount()を削除します。

だから私の代わりには次のようになります。

var MaleStudents = students.Where(Std => Std.Gender.ToUpper() == "M"); 
var FemaleStudents = students.Where(Std => Std.Gender.ToUpper() == "F"); 

//List for storing top students records   
List<StudentEntity> TopStudents = new List<StudentEntity>(); 

//Adding records to List 
var maxMarksM = MaleStudents.Max(o => o.Marks); 
TopStudents = MaleStudents.Where(o => o.Marks == maxMarksM).ToList(); 

var maxMarksF = FemaleStudents.Max(o => o.Marks); 
TopStudents.AddRange(FemaleStudents.Where(o => o.Marks == maxMarksF).ToList()); 

return TopStudents; 
+0

最後の'ToList() 'は必要ないと思います。 –

+0

そして私は、最初の2つの 'Where'の後に、'ToList() 'を書いたほうがいいと思います。 –

+0

そして、最も重要なことに、MaleStudentsが空の場合、 'Max()'は失敗します。 –

6
var topStudents = allStudents 
       .GroupBy(s => s.Gender.ToUpper()) // Dividing the students to groups by gender 
       .Where(g => g.Key == "M" || g.Key == "F") // Including only the Male and Female genders 
       .Select(g => g.Where(s => s.Marks == g.Max(i => i.Marks))) // From each group, finding the highest mark and selecting from that groups all the student with that mark 
       .SelectMany(s => s) // selecting all the students from all the inner groups 
       .ToList(); 

編集:

@Alexey Subbotaはg.Maxは、それが不要な、我々だけではグループ内のすべての学生のために1回呼び出されます実際には、あまりにも何度も呼び出されるかもしれないことを示唆し グループごとに最大値を1回計算する必要があります。私はGroovyでプログラムが、それはこの場合の違いを作るべきではありません。

var topStudents = allStudents 
       .GroupBy(s => s.Gender.ToUpper()) // Dividing the students to groups by gender 
       .Where(g => g.Key == "M" || g.Key == "F") // Including only the Male and Female genders 
       .Select(g => new KeyValuePair<int, IEnumerable<Student>>(g.Max(s => s.Marks), g)) // Storing the group together with it's highest score value 
       .Select(g => g.Value.Where(s => s.Marks == g.Key)) // From each group, selecting the student that have the highest score 
       .SelectMany(s => s) // selecting all the students from all the inner groups 
       .ToList(); 
+0

良い答えを使用しないようにすることができますが、私のためとして、それが呼び出すのは難しいですそれは "より簡単です"^_^ – Spawn

+0

g.Max(i => i.Marks)が何度も呼び出されることに恐れています。 –

+0

@AlexeySubbota、はい、あなたは正しいです。私はそれに応じて私の答えを編集しました。 – areller

関連する問題