如何将平面数据集转换为分层数据集?

时间:2015-03-23 22:36:45

标签: c# linq collections

我有一个收集形式的平面数据如下:

historyId   documentId   statusId
612         2            1
612         3            2
612         4            5
612         2            4

当上述数据填充到myClassFlat的集合中时,它将在集合中有四个成员

class myClassFlat{
    public int historyId {get; set;}
    public int documentId { get; set;}
    public int statusId {get; set;}
}

我想将heirarchical数据转换为另一个集合,如下所示,以便documentId中的重复值被分组,并且statusId被加载到类中的数组中:

historyId   documentId   statusId
612         2            1, 4
612         3            2
612         4            5

因此,当数据填充到以下myClassHierarchical的集合中时,它将只有三个成员,因为statusId,1和4的两个值将填充到类<{1}} statusId中/ p>

int[]

我尝试首先使用Linq通过documentId查找集合的唯一成员,然后循环遍历非唯一成员并创建类的列表并使用statusId填充int [],但无法使其工作。

1 个答案:

答案 0 :(得分:1)

看起来你只想按两个字段分组:

var list = new List<myClassFlat>
    {
        new myClassFlat() { historyId = 612, documentId = 2, statusId = 1},
        new myClassFlat() { historyId = 612, documentId = 3, statusId = 2},
        new myClassFlat() { historyId = 612, documentId = 4, statusId = 5},
        new myClassFlat() { historyId = 612, documentId = 2, statusId = 4},
    };

var result = list.GroupBy(x => new { x.historyId, x.documentId })
                 .Select(g => new myClassHierarchical()
                     {
                         historyId = g.Key.historyId,
                         documentId = g.Key.documentId,
                         statusId = g.Select(x => x.statusId).ToArray()
                     });