2015-04-03 98 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