以下是我的课程:
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名称?
答案 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;
}