using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
var tblClass = new List<TblClassRow>
{
new TblClassRow("Class1", "A"),
new TblClassRow("Class1", "B"),
new TblClassRow("Class1", "C"),
new TblClassRow("Class2", "B"),
new TblClassRow("Class2", "C"),
new TblClassRow("Class3", "C"),
};
var res = tblClass
.GroupBy(g=> g.ClassId)
.Select(c =>
{
var rr = new ResultRow {Class = c.Key};
foreach (var r in tblClass.GroupBy(gg=> gg.Student))
{
rr.Students[r.Key] = "N";
}
foreach (var r in c.Where(w=> w.ClassId == c.Key))
{
rr.Students[r.Student] = "Y";
}
return rr;
}).ToList();
Console.WriteLine(res.First().GetHeader());
foreach (var r in res)
{
Console.WriteLine(r.GetSolidRow());
}
}
internal class TblClassRow
{
public TblClassRow(string classId, string student)
{
ClassId = classId;
Student = student;
}
public string ClassId { get; set; }
public string Student { get; set; }
}
internal class ResultRow
{
public ResultRow()
{
Students = new Dictionary<string, string>();
}
public string Class { get; set; }
public IDictionary<string, string> Students { get; set; }
public string GetHeader()
{
return Students.Aggregate("Class", (current, s) => current + "|" + s.Key);
}
public string GetSolidRow()
{
return Students.Aggregate(Class, (current, s) => current + "|" + s.Value);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIHRibENsYXNzID0gbmV3IExpc3Q8VGJsQ2xhc3NSb3c+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5ldyBUYmxDbGFzc1JvdygiQ2xhc3MxIiwgIkEiKSwKICAgICAgICAgICAgICAgIG5ldyBUYmxDbGFzc1JvdygiQ2xhc3MxIiwgIkIiKSwKICAgICAgICAgICAgICAgIG5ldyBUYmxDbGFzc1JvdygiQ2xhc3MxIiwgIkMiKSwKICAgICAgICAgICAgICAgIG5ldyBUYmxDbGFzc1JvdygiQ2xhc3MyIiwgIkIiKSwKICAgICAgICAgICAgICAgIG5ldyBUYmxDbGFzc1JvdygiQ2xhc3MyIiwgIkMiKSwKICAgICAgICAgICAgICAgIG5ldyBUYmxDbGFzc1JvdygiQ2xhc3MzIiwgIkMiKSwKCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcmVzID0gdGJsQ2xhc3MKICAgICAgICAgICAgICAgICAgICAuR3JvdXBCeShnPT4gZy5DbGFzc0lkKQogICAgICAgICAgICAgICAgICAgIC5TZWxlY3QoYyA9PgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJyID0gbmV3IFJlc3VsdFJvdyB7Q2xhc3MgPSBjLktleX07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIHRibENsYXNzLkdyb3VwQnkoZ2c9PiBnZy5TdHVkZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnIuU3R1ZGVudHNbci5LZXldID0gIk4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIGMuV2hlcmUodz0+IHcuQ2xhc3NJZCA9PSBjLktleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyLlN0dWRlbnRzW3IuU3R1ZGVudF0gPSAiWSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJyOwogICAgICAgICAgICAgICAgICAgIH0pLlRvTGlzdCgpOwoKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUocmVzLkZpcnN0KCkuR2V0SGVhZGVyKCkpOwogICAgICAgICAgICBmb3JlYWNoICh2YXIgciBpbiByZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHIuR2V0U29saWRSb3coKSk7CiAgICAgICAgICAgIH0KCX0KCQoJICAgICAgICBpbnRlcm5hbCBjbGFzcyBUYmxDbGFzc1JvdwogICAgICAgIHsKICAgICAgICAgICAgcHVibGljIFRibENsYXNzUm93KHN0cmluZyBjbGFzc0lkLCBzdHJpbmcgc3R1ZGVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2xhc3NJZCA9IGNsYXNzSWQ7CiAgICAgICAgICAgICAgICBTdHVkZW50ID0gc3R1ZGVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIHN0cmluZyBDbGFzc0lkIHsgZ2V0OyBzZXQ7IH0KCiAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgU3R1ZGVudCB7IGdldDsgc2V0OyB9CiAgICAgICAgfQoKICAgICAgICBpbnRlcm5hbCBjbGFzcyBSZXN1bHRSb3cKICAgICAgICB7CiAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRSb3coKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdHVkZW50cyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgc3RyaW5nIENsYXNzIHsgZ2V0OyBzZXQ7IH0KCiAgICAgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gU3R1ZGVudHMgeyBnZXQ7IHNldDsgfQoKICAgICAgICAgICAgcHVibGljIHN0cmluZyBHZXRIZWFkZXIoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gU3R1ZGVudHMuQWdncmVnYXRlKCJDbGFzcyIsIChjdXJyZW50LCBzKSA9PiBjdXJyZW50ICsgInwiICsgcy5LZXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEdldFNvbGlkUm93KCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0dWRlbnRzLkFnZ3JlZ2F0ZShDbGFzcywgKGN1cnJlbnQsIHMpID0+IGN1cnJlbnQgKyAifCIgKyBzLlZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KfQ==