C# Linq To DataTable 分组统计

本文通过具体示例介绍了使用LINQ进行数据分组和聚合操作的方法,包括单字段和多字段分组,以及如何计算每组的汇总统计数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataTable dt = SQLLayer.Get工作量统计(beginDate, endDate);
            var querySum = from t in dt.AsEnumerable()
                           group t by t.Field<string>("库房")
                               into g
                               select new
                                   {
                                       _库房 = g.Key,
                                       _品次_入库 = g.Sum(t => t.Field<decimal>("品次_入库")),
                                       _品种_入库 = g.Sum(t => t.Field<decimal>("品种_入库")),
                                       _金额_入库 = g.Sum(t => t.Field<decimal>("金额_入库")),
                                       _品次_出库 = g.Sum(t => t.Field<decimal>("品次_出库")),
                                       _品种_出库 = g.Sum(t => t.Field<decimal>("品种_出库")),
                                       _金额_出库 = g.Sum(t => t.Field<decimal>("金额_出库")),
                                       _品种_现存 = g.Sum(t => t.Field<decimal>("品种_现存")),
                                       _金额_现存 = g.Sum(t => t.Field<decimal>("金额_现存"))
                                   };

            DataTable newDt = new DataTable();

            DataRow newRow = null;
            newDt.Columns.Add("库房", typeof(string));
            newDt.Columns.Add("品次_入库", typeof(decimal));
            newDt.Columns.Add("品种_入库", typeof(decimal));
            newDt.Columns.Add("金额_入库", typeof(decimal));
            newDt.Columns.Add("品次_出库", typeof(decimal));
            newDt.Columns.Add("品种_出库", typeof(decimal));
            newDt.Columns.Add("金额_出库", typeof(decimal));
            newDt.Columns.Add("品种_现存", typeof(decimal));
            newDt.Columns.Add("金额_现存", typeof(decimal));

            foreach (var query in querySum)
            {
                newRow = newDt.NewRow();
                newRow["库房"] = query._库房;
                newRow["品次_入库"] = query._品次_入库;
                newRow["品种_入库"] = query._品种_入库;
                newRow["金额_入库"] = query._金额_入库;
                newRow["品次_出库"] = query._品次_出库;
                newRow["品种_出库"] = query._品种_出库;
                newRow["金额_出库"] = query._金额_出库;
                newRow["品种_现存"] = query._品种_现存;
                newRow["金额_现存"] = query._金额_现存;
                newDt.Rows.Add(newRow);

            }
 private void btnLinqTest__Click(object sender, EventArgs e)
        {
            DataTable vtblSeqBase = this.DM.bdsSingle._mpDataTable;

            //1. GroupBy 统计
var query =
               from q in vtblSeqBase.AsEnumerable()
               group q by q.Field<string>("MachineType") into r
               select new
               {
                   _qMachType = r.Key,
                   _qCount = r.Count()
               };

            using (DataTable vtblCount = new DataTable())
            {
                DataRow vNewRow = null;
                vtblCount.Columns.Add("MachType", typeof(string));
                vtblCount.Columns.Add("Count", typeof(int));
                foreach (var vq in query)
                {
                    vNewRow = vtblCount.NewRow();
                    vNewRow["MachType"] = vq._qMachType;
                    vNewRow["Count"] = vq._qCount;
                    vtblCount.Rows.Add(vNewRow);
                }
                //vtblCount.mmViewForRD();
            }

            //2. Distinct用法       XXXTestOk 2011-07-18
            var d = (from DataRow vRow in vtblSeqBase.Rows
                     select new { _MachType = vRow["MachineType"] }).Distinct();
            using (DataTable vtblDistinct = new DataTable())
            {
                DataRow vNewRow = null;
                vtblDistinct.Columns.Add("MachType", typeof(string));
                vtblDistinct.Columns.Add("Count", typeof(int));
                foreach (var q in d)
                {
                    vNewRow = vtblDistinct.NewRow();
                    vNewRow["MachType"] = q._MachType;
                    vtblDistinct.Rows.Add(vNewRow);
                }
                //vtblDistinct.mmViewForRD();
            }

            //DataTableExtensions.CopyToDataTable

            //3.
            List<int> vListNum = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
            IEnumerable<int> vDistNum = vListNum.Distinct();
            foreach (int n in vDistNum)
            {
                //MessageBox.Show("不重复的数值 =" + n.ToString());
            }

            //4. Group By 一个字段
            var querySum =
                from q in vtblSeqBase.AsEnumerable()
                group q by q.Field<string>("MachineType") into g
                select new
                {
                    _qMachType = g.Key,
                    _qSamTotal = g.Sum(q => q.Field<decimal>("SamValue"))
                };

            using (DataTable vtblSAMTotal  = new DataTable())
            {
                DataRow vNewRow = null;
                vtblSAMTotal.Columns.Add("MachType", typeof(string));
                vtblSAMTotal.Columns.Add("SAMTotal", typeof(decimal));
                foreach (var vq in querySum)
                {
                    vNewRow = vtblSAMTotal.NewRow();
                    vNewRow["MachType"] = vq._qMachType;
                    vNewRow["SAMTotal"] = vq._qSamTotal;
                    vtblSAMTotal.Rows.Add(vNewRow);
                }
                //vtblSAMTotal.mmViewForRD();
            }

            //5. Group By 多个字段 GBN = Group By NField
            var queryGBN  =
                from q in vtblSeqBase.AsEnumerable()
                group q by new {机器代码=q.Field<string>("MachineType"), 工序代码=q.Field<string>("SeqCode") }
                into g
                select new
                {
                    _qMachType = g.Key,
                    _qSamTotal = g.Sum(q => q.Field<decimal>("SamValue")),
                    _qSamAvg = g.Average(q => q.Field<decimal>("SamValue"))
                };

            using (DataTable vtblSAMTotal = new DataTable())
            {
                DataRow vNewRow = null;
                vtblSAMTotal.Columns.Add("MachType", typeof(string));
                vtblSAMTotal.Columns.Add("SeqCode", typeof(string));
                vtblSAMTotal.Columns.Add("SAMTotal", typeof(decimal));
                vtblSAMTotal.Columns.Add("SAMAvg", typeof(decimal));
                foreach (var vq in queryGBN)
                {
                    vNewRow = vtblSAMTotal.NewRow();
                    vNewRow["MachType"] = vq._qMachType;
                    vNewRow["SeqCode"] = vq._qMachType;
                    vNewRow["SAMTotal"] = vq._qSamTotal;
                    vNewRow["SAMAvg"] = vq._qSamAvg;
                    vtblSAMTotal.Rows.Add(vNewRow);
                }
                vtblSAMTotal.mmViewForRD();
            }
        }


### 使用 C# DataTable 进行列表数据统计C# 中,`DataTable` 是一种非常灵活的数据结构,可以用来存储和操作表格形式的数据。为了实现对 `DataTable` 的统计数据处理,通常会结合 LINQ 查询来完成复杂的计算任务。 以下是基于所提供的引用内容以及专业知识的回答: #### 创建并初始化 DataTable 可以通过创建一个新的 `DataTable` 并定义其列来进行初始设置。例如: ```csharp // 初始化 DataTable DataTable tgi = new DataTable(); tgi.Columns.Add("类型", typeof(int)); tgi.Columns.Add("商品编码(sku)", typeof(string)); tgi.Columns.Add("零售单价", typeof(double)); ``` 此部分代码用于定义表的结构及其各字段的数据类型[^1]。 #### 向 DataTable 添加行 通过调用 `Rows.Add()` 方法向 `DataTable` 插入新记录。例如: ```csharp tgi.Rows.Add(1, "SKU001", 99.9); tgi.Rows.Add(2, "SKU002", 78.5); tgi.Rows.Add(1, "SKU003", 45.6); ``` 上述代码片段展示了如何向已有的 `DataTable` 表格中添加具体数据项。 #### 利用 LINQDataTable 数据进行统计分析 LINQ 提供了一种强大的方式查询和转换集合中的数据,包括来自 `DataTable` 的数据。下面是一个简单的例子展示如何按某一特定条件聚合数据,并将其重新写回到新的 `DataTable` 中。 假设我们需要按照 “类型” 字段分组并对每组内的 “零售单价” 计算总和,则可执行如下操作: ```csharp var result = from row in tgi.AsEnumerable() group row by row.Field<int>("类型") into g select new { 类型 = g.Key, 总价 = g.Sum(r => r.Field<double>("零售单价")) }; // 将结果存回另一个 DataTable DataTable summaryTable = new DataTable(); summaryTable.Columns.Add("类型", typeof(int)); summaryTable.Columns.Add("总价", typeof(double)); foreach (var item in result) { summaryTable.Rows.Add(item.类型, item.总价); } ``` 这里利用了 LINQ 来对原始 `DataTable` 实施分组与求和逻辑[^2]。最终的结果被保存到名为 `summaryTable` 的新表里以便进一步使用或者显示给用户查看。 #### 完整示例程序 综合以上各个步骤,完整的演示代码可能看起来像这样: ```csharp using System; using System.Data; using System.Linq; class Program { static void Main() { // Step 1: Create and initialize the DataTable. DataTable tgi = new DataTable(); tgi.Columns.Add("类型", typeof(int)); tgi.Columns.Add("商品编码(sku)", typeof(string)); tgi.Columns.Add("零售单价", typeof(double)); // Step 2: Add rows to the table. tgi.Rows.Add(1, "SKU001", 99.9); tgi.Rows.Add(2, "SKU002", 78.5); tgi.Rows.Add(1, "SKU003", 45.6); // Step 3: Use LINQ to perform statistical analysis on data within the DataTable. var results = from row in tgi.AsEnumerable() group row by row.Field<int>("类型") into g select new { Type = g.Key, TotalPrice = g.Sum(r => r.Field<double>("零售单价")) }; // Step 4: Store processed information back into another DataTable. DataTable summaryTable = new DataTable(); summaryTable.Columns.Add("类型", typeof(int)); summaryTable.Columns.Add("总价", typeof(double)); foreach(var res in results){ summaryTable.Rows.Add(res.Type, res.TotalPrice); } Console.WriteLine(summaryTable.ToString()); } } ``` 这段代码实现了从构建基础数据集到最后生成汇总报表的整体流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值