2017-02-16 39 views
1

下面是我的課:試圖組內的孩子名單,並得到共同記錄

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

第一步是使用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; 
} 
+0

是的,這工作。非常感謝你的努力,幫助我,請繼續幫助像這樣:) –