尝试对内部子列表进行分组并获取常见记录

时间:2017-02-16 13:59:13

标签: c# linq grouping

以下是我的课程:

public class MyData
    {
        public string Region { get; set; }
        public List<TestList> TestList { get; set; }
    }

 public class TestList
    {
        public int? TestId { get; set; }
    }

以上类别包含以下示例数据(var data = List<MyData>()):

[o] : Region = "abc"
      "TestList": 
       [
         {
           TestId : 100
         },
         {
           TestId : 101
         },
       ],
[1] : Region = "Pqr"
      "TestList": 
       [
         {
           TestId : 100
         },
         {
           TestId : 101
         },
       ],
[2] : Region = "Lmn"
      "TestList": 
       [
         {
           TestId : 100
         },
         {
           TestId : 101
         },
         {
           TestId : 102
         },
       ]

下面是我试图获取测试列表的示例类,对于每个测试,我想要变体列表,即Abc,Pq,lmn:

public class Test
    {
        public int TestId { get; set; }
        public List<VariantsRank> VariantsRanks { get; set; }
    }

    public class VariantsRank
    {
        public string Name { get; set; }
        public int Rank { get; set; }
    }

我正在尝试在上面的类中生成最终输出,如下面的List<Test>

[0] :Test Id = 100
   "VariantsRanks": 
       [
         {
           Name : "abc",
           Rank : 0   
         },
         {
            Name : "Pqr",
            Rank : 1 
         },
         {
           Name : "Lmn",
           Rank :  2
         },
       ],
[1] :Test Id = 101
   "VariantsRanks": 
       [
         {
           Name : "abc",
           Rank : 0   
         },
         {
            Name : "Pqr",
            Rank : 1 
         },
         {
           Name : "Lmn",
           Rank :  2
         },
       ],
[2] :Test Id = 102
   "VariantsRanks": 
       [
         {
           Name : "lmn",
           Rank : 0   
         },
       ]

所以这就是我尝试生成List<Test>的方法,但在这里我不明白我如何通过嵌套的TestList进行分组,以便我可以获得常见的VariantsRank名称?

1 个答案:

答案 0 :(得分:1)

第一步是使用SelectMany“展平”嵌套列表,以便拥有TestId,Region的元组。然后很容易通过TestId进行分组以获得排名顺序的区域。它看起来像这样:

IEnumerable<Test> Group(this IEnumerable<MyData> data)
{
    var pairs = data
        .SelectMany(d => d.TestList
             .Select(t => new {
                 Region = d.Region,
                 TestId: t.TestId
             })
        );

    // now group by testId
    var groups = pairs.GroupBy(pair => pair.TestId);

    // now convert each group to your Test class
    var result = groups.Select(group => new Test
        {
            TestId = pair.Key,
            VariantsRanks = group.Select((p, i) =>
               new VariantsRank { Name = p.Region, Rank = i }).ToList()
        }
    );

    return result;
}