2015-04-03 101 views
1

我需要将List<Students>过滤为StudentsWitHighestDebts如何使用LINQ C过滤列表#

标准是只有在ZachetDidNotPass有最大值的学生和maximum-1在所有List<Students>都包括在结果中。

var StudentsWitHighestDebts = students 
       .Where(s => s.ZachetDidNotPass.(some condition)) 
       .OrderBy(s => s.Name) 
       .ToList(); 

例如,假设有ZachetDidNotPass0 1 2 5 6 7学生名单。由此产生的StudentsWitHighestDebts只应包含ZachetDidNotPass7 and 6值的学生。

+2

只需放在另一个“Where”中。 – 2015-04-03 07:17:39

+0

这真的是一个很愚蠢的问题,我需要努力使用:(? – 2015-04-03 07:24:36

+0

@PatrickHofman仍然无法理解 - 什么条件会在(某些条件下)只检查max?然后,是的,我会添加一个max-1 ... – 2015-04-03 07:27:39

回答

3

第一种选择:取2最高债务和过滤学生通过ZachetDidNotPass:

var highestDebts = students.Select(s => s.ZachetDidNotPass) 
    .OrderByDescending(p => p).Take(2).ToArray(); 
var studentsWitHighestDebts = students 
    .Where(s => highestDebts.Contains(s.ZachetDidNotPass)) 
    .OrderByDescending(s => s.ZachetDidNotPass).ToList(); 

第二个方案 - 按ZachetDidNotPass,通过关键降序排序组,取前2组,然后从学生群体

var studentsWitHighestDebts = students.GroupBy(s => s.ZachetDidNotPass) 
    .OrderByDescending(g => g.Key).Take(2) 
    .SelectMany(g => g).ToList(); 

而第三个选项(需要学生具有最高的债务和highestDebt - 1)

var highestDebt = students.Max(s => s.ZachetDidNotPass); 

var studentsWitHighestDebts = students 
    .Where(s => s.ZachetDidNotPass == highestDebt || s.ZachetDidNotPass == highestDebt - 1) 
    .OrderByDescending(s => s.ZachetDidNotPass).ToList(); 
+0

第二个选项并不是最优的,你应该解释第一个和第三个选项之间的区别,例如,如果值是'0 1 2 3 4 5 7',我们应该带'5'的学生吗? – Orace 2015-04-03 07:44:55

+0

'说第二个选项是相当不错的。 – UrbanEsc 2015-04-03 08:28:53