積分boy 2023-05-16 19:18 采纳率: 50%
浏览 18
已结题

如何在C#的datatable用LINQ转换表格

以下表格请问在C#的datable中请问如何用LINQ把表一整理变成表二并且输入呈现在EXCEL上呢?
表一

MPS_VERSIONFABPARTNUMBER_CHILDDEMANDLM_USERM_WEEK
1厂1A100ANTHONYW2320
1厂1A150ANTHONYW2321
1厂2A150ANTHONYW2322
1厂2B150ANTHONYW2324
1厂2B200ANTHONYW2325
2厂1A200ANTHONYW2322
2厂1A250ANTHONYW2320
2厂2A300ANTHONYW2321
2厂1B100ANTHONYW2320
3厂1A50ANTHONYW2321
3厂1B100ANTHONYW2321
3厂1A150ANTHONYW2322
3厂1B10ANTHONYW2322

表二

MPS_VERSIONFABPARTNUMBER_CHILDW2320W2321W2322W2324W2325
1厂1A100150
1厂2A150
1厂2B150
1厂2B200
2厂1A250200
2厂2A300
2厂1B100
3厂1A50150
3厂1B10010
  • 写回答

2条回答 默认 最新

  • object0812 2023-05-17 10:56
    关注
    
    
    ```c#
    DataTable table = new DataTable();
                table.Columns.Add("MPS_VERSION", typeof(int));
                table.Columns.Add("FAB", typeof(string));
                table.Columns.Add("PARTNUMBER_CHILD", typeof(string));
                table.Columns.Add("DEMAND", typeof(int));
                table.Columns.Add("LM_USER", typeof(string));
                table.Columns.Add("M_WEEK", typeof(string));
    
                // 添加数据
                table.Rows.Add(1, "厂1", "A", 100, "ANTHONY", "W2320");
                table.Rows.Add(1, "厂1", "A", 150, "ANTHONY", "W2321");
                table.Rows.Add(1, "厂2", "A", 150, "ANTHONY", "W2322");
                table.Rows.Add(1, "厂2", "B", 150, "ANTHONY", "W2324");
                table.Rows.Add(1, "厂2", "B", 200, "ANTHONY", "W2325");
                table.Rows.Add(2, "厂1", "A", 200, "ANTHONY", "W2322");
                table.Rows.Add(2, "厂1", "A", 250, "ANTHONY", "W2320");
                table.Rows.Add(2, "厂2", "A", 300, "ANTHONY", "W2321");
                table.Rows.Add(2, "厂1", "B", 100, "ANTHONY", "W2320");
                table.Rows.Add(3, "厂1", "A", 50, "ANTHONY", "W2321");
                table.Rows.Add(3, "厂1", "B", 100, "ANTHONY", "W2321");
                table.Rows.Add(3, "厂1", "A", 150, "ANTHONY", "W2322");
                table.Rows.Add(3, "厂1", "B", 10, "ANTHONY", "W2322");
    
                var columnNames = table.AsEnumerable().Select(row => row.Field<string>("M_WEEK")).Distinct().ToList();
    
                var dict = table.AsEnumerable()
                        .GroupBy(row => new {
                            MPS_VERSION = row.Field<int>("MPS_VERSION"),
                            FAB = row.Field<string>("FAB"),
                            PARTNUMBER_CHILD = row.Field<string>("PARTNUMBER_CHILD")
                        })
                        .ToDictionary(
                            group => new {
                                group.Key.MPS_VERSION,
                                group.Key.FAB,
                                group.Key.PARTNUMBER_CHILD
                            },
                            group => columnNames.Aggregate(
                                new Dictionary<string, int>(),
                                (acc, curr) => {
                                    acc[curr] = group.FirstOrDefault(x => x.Field<string>("M_WEEK") == curr)?.Field<int>("DEMAND") ?? 0;
                                    return acc;
                                }
                            )
                        );
    
    
                DataTable newTable = new DataTable();
                newTable.Columns.Add("MPS_VERSION", typeof(int));
                newTable.Columns.Add("FAB", typeof(string));
                newTable.Columns.Add("PARTNUMBER_CHILD", typeof(string));
                columnNames.ForEach(name => newTable.Columns.Add(name, typeof(int)));
    
                // 添加新行和列
                foreach (var kvp in dict)
                {
                    var newRow = newTable.NewRow();
                    newRow["MPS_VERSION"] = kvp.Key.MPS_VERSION;
                    newRow["FAB"] = kvp.Key.FAB;
                    newRow["PARTNUMBER_CHILD"] = kvp.Key.PARTNUMBER_CHILD;
                    foreach (var cn in columnNames)
                    {
                        newRow[cn] = kvp.Value[cn];
                    }
                    newTable.Rows.Add(newRow);
                }
    
    
                Response.Write(newTable);
    
    

    ```

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月25日
  • 已采纳回答 5月17日
  • 创建了问题 5月16日