2016-08-15 45 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