Linq对DataTable或者集合的排序,Where筛选,分组,统计总数sum等操作

本文介绍了一个使用LINQ进行数据处理的实际案例,包括筛选、分组、排序和汇总等操作,展示了如何从复杂的数据集中提取有价值的信息。

 

//对集合进行筛选,排序,分组

var query = (from x in dsResult.Tables[0].AsEnumerable()
                Where DataTrans.CBoolean(x["IsChecked"]) == true
        Group x By new
        {
            no = x.Field<string>("NO"),
            ptno = x.Field<string>("PTNO"),
            ver = x.Field<int>("VER"),
            kd = x.Field<string>("KD"),
            que_da = Convert.ToDateTime(x.Field<DateTime>("QUE_DA").ToString("yyyy/MM/dd"))
        } into g
        OrderBy g.Key.no,g.Key.ptno,g.Key.ver,g.Key.kd,g.Key.que_da
        select new
        {
            qty = g.Sum(x => Convert.ToInt32(x["QUE_QTY"])),
            stock=g.Sum(x=>Convert.ToInt32(x["STOCK"])),
            no=g.Key.no ,
            ptno=g.Key.ptno,
            ver=g.Key.ver,
            kd=g.Key.kd,
            que_da=g.Key.que_da
        });
//统计一列的总数


var dtUnCheckNum = objFinanceCheckDB.UnCheckNum_Get(strReportDate1);
var queryTotal = (from DataRow row in dtUnCheckNum.Rows
                  select new { qsum = row["UnCheckNum"] }).Sum(a => Convert.ToInt32(a.qsum));
if (queryTotal == 0)
{
   lblWrongNum.Text = "0";
}
//简单按条件过滤

var records = dt.AsEnumerable().Where(a => Convert.ToInt32(a[0]) < 1000);
DataView rsl = records.AsDataView();

<think>我们要在C#中使用DataTable实现:根据某一列筛选数据,然后对另一列进行求和。有两种主要方式:1.使用DataTable的Compute方法2.使用LINQtoDataSet首先,我们假设有以下场景:我们有一个DataTable,其中包含多列数据,比如有一个“Category”列和一个“Amount”列。我们想根据“Category”列进行筛选(例如,只取Category为"Food"的行),然后对“Amount”列求和。方法一:使用DataTable.Compute方法步骤:a)使用DataTable.Select方法获取筛选后的行(或者直接使用Compute时在表达式中包含筛选条件)b)或者直接使用Compute方法,在表达式中同时指定筛选条件和求和函数。注意:Compute方法可以一次计算,表达式可以是聚合函数(如Sum)并包含条件。示例表达式:Sum(Amount)","Category='Food'"方法二:使用LINQ(需要引用System.Linq和System.Data.DataSetExtensions)步骤:a)使用AsEnumerable()将DataTable转换为IEnumerable<DataRow>b)使用Where方法进行筛选c)使用Sum方法求和下面分别给出示例:假设DataTable结构如下:列:Category(string),Amount(int)示例一(Compute方法):stringfilter="Category='Food'";//注意:如果Amount列是整型,则可以直接求和。如果是其他类型,需要转换。objectresult=dataTable.Compute("Sum(Amount)",filter);如果结果不是null,则转换为整数或小数等。示例二(LINQ方法):首先确保有引用:usingSystem.Linq;和usingSystem.Data;代码://假设DataTable名为dt//筛选Category为"Food"的行,然后对Amount列求和decimalsum=dt.AsEnumerable().Where(row=>row.Field<string>("Category")=="Food").Sum(row=>row.Field<decimal>("Amount"));注意:字段的数据类型要与实际匹配。如果Amount列是整数类型,可以使用Field<int>,如果是小数,则用decimal等。另外,如果我们在同一个操作中既需要筛选又需要求和,使用LINQ通常更直观。但是,用户提到要根据某一列筛选(该列可能是任意列,并且条件可能是多个),然后对另一列求和。我们可以写一个通用的方法:方法一(Compute)的通用性:可以动态构建筛选条件字符串和表达式字符串。方法二(LINQ)的通用性:可以使用动态构建的谓词,但需要动态处理字段类型,这比较复杂。不过如果列名和条件固定,则直接写即可。下面我们给出两种方法的简单示例:示例代码:方法一:ComputestringcolumnToFilter="Category";//要筛选的列名stringfilterValue="Food";//筛选的值stringcolumnToSum="Amount";//要求和的列名stringfilterExpression=$"{columnToFilter}='{filterValue}'";objectresult=dataTable.Compute($"Sum({columnToSum})",filterExpression);//注意:这里假设筛选列是字符串类型,并且要求和的列是数值类型。如果筛选列不是字符串,可能需要更改单引号内的内容(比如数值就不需要单引号)。//如果有多条件,可以用and/or连接。方法二:LINQ(针对已知类型)stringcolumnToFilter="Category";stringfilterValue="Food";stringcolumnToSum="Amount";//注意:这里假设已知列的类型,实际中可能需要根据列类型进行动态处理varfilteredRows=dataTable.AsEnumerable().Where(row=>row.Field<string>(columnToFilter)==filterValue);decimalsum=filteredRows.Sum(row=>row.Field<decimal>(columnToSum));但是如果列类型是动态的,我们可以这样处理(使用Convert.ChangeType?):但LINQ表达式中的类型需要明确,所以动态类型处理比较复杂。因此,如果列类型固定,最好用上面的方法。考虑到简单性和通用性,如果条件简单,使用Compute方法更方便。注意:Compute方法在处理大型DataTable时性能可能不如LINQ,因为每次计算都需要解析表达式,并且筛选过程可能不是最优。另外,如果我们需要多次使用同一组筛选行,那么先用Select选出这些行,再用Compute或LINQ求和,则效率不高。此时,可以先筛选出行,再对这些行进行求和(LINQ更适合)。综上所述,根据需求选择合适的方法。下面给出一个完整的示例(使用Compute和LINQ两种方法):</think> 在C#中使用DataTable进行数据筛选和列值求和,有以下几种实现方式: ### 📌 方法一:使用LINQ(推荐方式) ```csharp // 假设按"Category"列筛选,对"Amount"列求和 string filterValue = "Electronics"; // 要筛选的值 string groupColumn = "Category"; // 分组列名 string sumColumn = "Amount"; // 求和列名 var resultSum = dt.AsEnumerable() .Where(row => row.Field<string>(groupColumn) == filterValue) .Sum(row => row.Field<int>(sumColumn)); Console.WriteLine($"分类为{filterValue}的总金额:{resultSum}"); ``` **说明**: 1. `AsEnumerable()`将DataTable转换为可查询集合 2. `Where()`实现指定列的筛选条件 3. `Sum()`对目标列进行聚合计算 4. 支持任何实现了`IComparable`的数据类型[^2][^3] ### ⚙ 方法二:使用Compute方法 ```csharp // 筛选条件 + 求和计算 string filterCondition = "Category = 'Electronics'"; object sumResult = dt.Compute($"SUM(Amount)", filterCondition); if (sumResult != DBNull.Value) { Console.WriteLine($"合计值:{Convert.ToDecimal(sumResult)}"); } ``` **特点**: - 单行代码完成筛选和求和 - 支持类似SQL的表达式语法 - 返回值需进行类型转换[^3][^4] ### 📊 方法三:分组后求和(多条件汇总) ```csharp // 按多列分组后求和(示例:按品名+规格分组统计数量总和) var groupedData = dt.AsEnumerable() .GroupBy(r => new { Name = r.Field<string>("品名"), Spec = r.Field<string>("规格") }) .Select(g => new { g.Key.Name, g.Key.Spec, Total = g.Sum(r => r.Field<int>("数量")) }); foreach(var item in groupedData) { Console.WriteLine($"{item.Name}({item.Spec}): {item.Total}"); } ``` **应用场景**: - 多维度数据汇总 - 分组统计报表 - 交叉数据分析[^1][^2] ### 🔍 方法四:Select方法筛选(早期.NET版本) ```csharp // 适用于.NET Framework 2.0+ DataRow[] filteredRows = dt.Select("Category = 'Electronics'"); decimal sum = 0; foreach(DataRow row in filteredRows) { sum += Convert.ToDecimal(row["Amount"]); } ``` 💡 **性能建议**: 1. 大数据集 (>10,000行) 优先使用LINQ,性能更优 2. 简单筛选求和用Compute更简洁 3. 对日期类型字段需注意格式转换 --- **注意事项**: 1. 求和列需为数值类型(int/decimal/double等) 2. 空值处理建议添加默认值:`row.Field<int?>("列名") ?? 0` 3. 列名大小写敏感 4. 复杂条件可使用组合表达式: ```csharp .Where(row => row.Field<string>("Category") == "Electronics" && row.Field<DateTime>("Date") > new DateTime(2023,1,1)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值