LINQ集团进入专栏

时间:2014-06-04 13:06:11

标签: c# linq list

如何将最多7个行分组到一行中,其中set列确定分组?

我没有修复行。

我看到Stack溢出已经有了这个问题,但答案是在SQL中。

我需要LINQ。我不知道如何实现这个目标?

请查看下面的StackOverflow链接

T- SQL group rows into columns

Table 

Id  RefId  Name   
------------------------
 1    1    Test1    
 2    1    Test2    
 3    1    Test3    
 4    2    Test4    
 5    2    Test5    

所以,输出将是......

RefId  Name1  Name2  Name3  Name4 Name5 Name6 Name7  Id1 Id2 Id3 Id4  Id5  Id6  Id7
-----------------------------------------------------------------------------------
 1     Test1  Test2  Test4  null  null  null  null   1   2   3   null null null null
 2     Test4  Test5   null  null  null  null  null   4   5  null null null null null

这里修复了行达到7 ...不超过

2 个答案:

答案 0 :(得分:2)

这可能是一件简单的事情吗?

var persons = new []{
        new Person{Name = "John", Link = "L1"},
        new Person{Name = "John", Link = "L2"},
        new Person{Name = "John", Link = "L3"},
        new Person{Name = "Steve", Link = "L1"},
        new Person{Name = "Steve", Link = "L2"},
    };

var grouped = persons.GroupBy(p => p.Name)
                     .Select(g => new{Name = g.Key, Links = g.Select(x => x.Link)});

答案 1 :(得分:0)

以下是涵盖您案例的解决方案:

DataTable dtInput = new DataTable();
dtInput.Columns.Add("Id");
dtInput.Columns.Add("RefId");
dtInput.Columns.Add("Name");

DataTable dtOutput = new DataTable();
dtOutput.Columns.Add("RefId");
Enumerable.Range(1,7).ToList()
    .ForEach( i => { dtOutput.Columns.Add("Name"+i ); dtOutput.Columns.Add("Id"+i ); }  );

dtInput.Rows.Add( new object[] { "1", "1", "Test1" } );
dtInput.Rows.Add( new object[] { "2", "1", "Test2" } );
dtInput.Rows.Add( new object[] { "3", "1", "Test3" } );
dtInput.Rows.Add( new object[] { "4", "2", "Test4" } );
dtInput.Rows.Add( new object[] { "5", "2", "Test5" } );

dtInput.AsEnumerable()
    .GroupBy(x => new { RefId = x["RefId"] })
    .Select(x => new { RefId = x.Key.RefId, 
                        Names = x.Select(x1 => x1["Name"]), 
                        Ids = x.Select(x1 => x1["Id"])})
    .ToList().ForEach( g =>
        {
            var row = dtOutput.NewRow();
            row["RefId"] = g.RefId;
            g.Names.Select( (n, idx) => new { idx = idx + 1, name = n } )
                .ToList().ForEach( n => row["Name"+n.idx] = n.name );
            g.Ids.Select( (i, idx) => new { idx = idx + 1, id = i } )
                .ToList().ForEach( i => row["Id"+i.idx] = i.id );
            dtOutput.Rows.Add( row );
        });