2016-08-15 79 views
0

我有以下對象更新對象的泛型列表:排序和基於子對象

public class TestResult 
    { 
     public string SectionName { get; set; } 
     public int Score { get; set; } 

     public int MaxSectionScore { get; set; } 

     public bool IsPartialScore { get; set; } 
     public string Name { get; set; } 

     public int NumberOfAttempts { get; set; } 
    } 

    public class TestResultGroup 
    { 
     public TestResultGroup() 
     { 
      Results = new List<TestResult>(); 
      Sections = new List<string>(); 
     } 
     public List<TestResult> Results { get; set; } 
     public List<string> Sections { get; set; } 
     public string Name { get; set; } 
     public int Rank { get; set; } 
    } 

所以,一個TestResultGroup可以有任意數量類型的TestResult結果。這些測試結果僅因其SectionName而異。

我有一個List<TestResultGroup>,我需要整理成基於Results財產得分降序排列,但只有當Results有一個項目衛生組織SectionName =「MeanScore」(如果它沒有這個部分,我們可以假設一個分數的-1)。我將如何去訂購清單?理想情況下,我還想將此訂購的結果應用於Rank財產。

非常感謝

回答

0
List<TestResultGroup> groups = ... 

// group test result groups by the same score and sort 
var sameScoreGroups = groups.GroupBy(
    gr => 
    { 
     var meanResult = gr.Results.FirstOrDefault(res => res.SectionName == "MeanScore"); 
     return meanResult != null ? meanResult.Score : -1; 
    }) 
    .OrderByDescending(gr => gr.Key); 

int rank = 1; 
foreach (var sameScoreGroup in sameScoreGroups) 
{ 
    foreach (var group in sameScoreGroup) 
    { 
     group.Rank = rank; 
    } 
    rank++; 
} 

// to obtain sorted groups: 
var sortedGroups = groups.OrderByDescending(gr => gr.Rank).ToArray(); 

甚至寫一個表達的副作用:

List<TestResultGroup> groups = ... 
int rank = 1; 
var sortedGroups = groups 
    .GroupBy(
     gr => 
     { 
      var meanResult = gr.Results.FirstOrDefault(res => res.SectionName == "MeanScore"); 
      return meanResult != null ? meanResult.Score : -1; 
    }) 
    .OrderByDescending(grouping => grouping.Key) 
    .SelectMany(grouping => 
     { 
      int groupRank = rank++; 
      foreach (var group in grouping) 
      { 
       group.Rank = groupRank; 
      } 
      return grouping; 
     }) 
    .ToArray(); // or ToList 
+0

有沒有辦法做到這一點,而無需使用6?它不是我的電話升級項目 – Mick

+0

我從我的解決方案中刪除空傳播算子,所以它不需要C#6.0 –

+0

非常感謝,你的排序工作像一個魅力,排名可悲的不是。我可能還不夠清楚,如果2個結果具有相同的平均分,那麼他們應該具有相同的排名 – Mick