2016-12-02 30 views
-1

我有数据列表。例如。从类别到子类别的Linq分组

| Id | Name | GroupId | GroupName | 
|----|------|---------|-----------| 
| 1 | nm1 | 1  | Group1 | 
| 2 | nm2 | 1  | Group1 | 
| 3 | nm3 | 1  | Group1 | 
| 4 | nm4 | 2  | Group2 | 
| 5 | nm5 | 2  | Group2 | 

{ id = 1, Name = "nm1", GroupId = 1, GroupName = "Group1" } 
{ id = 2, Name = "nm2", GroupId = 1, GroupName = "Group1" } 

我想要结果列表只有Id,Name。来自GroupId的Id变为-1。一个Id值为-1的空值也是需要的。 (空白)

| Id | Name  | 
|----|-----------| 
| -1 | Group1 | 
| 1 | nm1  |  
| 2 | nm2  | 
| 3 | nm3  |   
| -1 | blank  | 
| -1 | Group2 | 
| 4 | nm4  | 
| 5 | nm5  | 

是否有可能?

+0

为什么第一组包括5? – Rob

+0

@Rob抱歉,我的错误。我纠正了谢谢。 – user696383

回答

1

我认为你必须先对数据进行分组,然后重新组织下面的数据。

类,如下面

public class GroupData 
{ 
    public int Id { get; set; } 
    public String Name { get; set; } 
    public int GroupId { get; set; } 
    public String GroupName { get; set; } 
} 

public class Result 
{ 
    public int Id { get; set; } 
    public String Name { get; set; } 
} 

逻辑看起来像

//添加数据

List<GroupData> dataList = new List<GroupData>(); 

     dataList.Add(new GroupData() {Id = 1, Name = "nm1", GroupId = 1, GroupName = "Group1"}); 
     dataList.Add(new GroupData() { Id = 2, Name = "nm2", GroupId = 1, GroupName = "Group1" }); 
     dataList.Add(new GroupData() { Id = 3, Name = "nm3", GroupId = 1, GroupName = "Group1" }); 
     dataList.Add(new GroupData() { Id = 4, Name = "nm4", GroupId = 2, GroupName = "Group2" }); 
     dataList.Add(new GroupData() { Id = 5, Name = "nm5", GroupId = 2, GroupName = "Group2" }); 

//组数据

 var result = 
     (from data in dataList 
      group data by data.GroupName 
      into newGroup 
      orderby newGroup.Key 
      select newGroup); 

重新安排你的需要格式

var items=new List<Result>(); 
     foreach (var item in result) 
     { 
      items.Add(new Result {Id=-1, Name=item.Key}); 
      items.AddRange(item.ToList().Select(subItem => new Result {Id = subItem.Id, Name = subItem.Name})); 
      //You can add your blank record here. but not sure exact logic 
     } 
+0

不错。看起来需要foreach循环。我想也许它可以用多个选择linq或组来完成。当检测到新组时,将插入空白记录。 – user696383