1

我必须遍历每个部分并为行创建单元格以最终创建一个表。这里每个 Section 都有 rows 0....n,并且 Rows 有单元格说0...n

例如如下图所示:

Row 0->   Cell0 | Cell1| Cell2 | Cell3 | Cell4 | Cell5         
Row 1->   Cell0 | Cell1| Cell2 | Cell3 | Cell4 | Cell5      
Row 2->   Cell0 | Cell1| Cell2 | Cell3 | Cell4 | Cell5     
..

我想创建一个 lambda 表达式(比如说):

var allColumns = ...........         

要获取所有 Cell0,然后是所有 Cell1,所有 Cell2 等等......这样我就可以循环迭代并为每个单元创建一个表。该要求不希望我逐行进行,但希望我逐列进行(如上图中所示的单元格,我首先创建单元格 0,然后创建单元格 1,然后创建单元格 2 等,就像在下面的循环中一样。

foreach(Cell c in allColumns){
    //I want to iterate in this loop and create my cells and rows.    
}

你能帮我给这个 lambda 表达式吗?

我试着这样做

var allColumns = Sections.Rows.SelectMany(a=>a.Cells).GroupBy(What should come here).                             

您能否改进或建议一个更好的 Lambda 表达式,同时牢记上面的 foreach 循环和插图。提前致谢。

4

2 回答 2

2

你可以试试我整理的这个演示,看看它是否适合你(它应该放在 Windows 控制台应用程序中):

        DataTable dt = new DataTable();
        dt.Columns.AddRange(new DataColumn[] { 
               new DataColumn("col1"), 
               new DataColumn("col2"), 
               new DataColumn("col3") });

        dt.Rows.Add("cell0", "cell1", "cell2");
        dt.Rows.Add("cell0", "cell1", "cell2");
        dt.Rows.Add("cell0", "cell1", "cell2");
        dt.Rows.Add("cell0", "cell1", "cell2");

        // writes out the original data
        foreach (DataRow row in dt.Rows)
        {
            foreach (var column in row.ItemArray)
                Console.Write("{0} ", column);

            Console.WriteLine();
        }
        Console.WriteLine();

        // reverses columns and rows
        var result = dt.Columns
                       .Cast<DataColumn>()
                       .Select(column => 
                          dt.AsEnumerable()
                            .Select(row => 
                               row.ItemArray[column.Ordinal].ToString()));

        // writes out the reversed columns and rows
        foreach (var row in result)
        {
            foreach(var column in row)
                Console.Write("{0} ",column);

            Console.WriteLine();
        }

        Console.ReadKey();
于 2012-06-05T11:04:15.243 回答
0

Linqpad演示程序

我拿了 Ivan Gs Code 并创建了一个 Linqpad 程序

获取数据表的列

void Main(){        
    // get and write out the original data
    var dt = GetDataTable();
    dt.Dump();
    // get columns
    var result = GetColumnsFromDataTable(dt);
    result.ElementAt(0).Dump();
    result.ElementAt(1).Dump();
    result.ElementAt(2).Dump(); 
}
   
private IEnumerable<EnumerableRowCollection<String>> GetColumnsFromDataTable(DataTable dt){

    // Lambda Expression to get the cells 
    // vertically for a section containing rows     
    var result = dt.Columns.Cast<DataColumn>()
               .Select(column =>  dt.AsEnumerable()
               .Select(row => row.ItemArray[column.Ordinal].ToString()));   
    return result;
}

private DataTable GetDataTable(){
    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[] { 
        new DataColumn("col1 id"), 
        new DataColumn("col2 name"), 
        new DataColumn("col3 job") 
    });
    dt.Rows.Add("1", "John", "Barista");
    dt.Rows.Add("2", "Mike", "Handyman");
    dt.Rows.Add("3", "Jane", "Teacher");
    dt.Rows.Add("4", "Quentin", "Producer");
    return dt;
}
于 2013-02-17T07:33:23.523 回答