You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#.NET DataTable分组汇总时First/Last方法抛出类型转换异常

问题解决:First()/Last()引发的类型转换异常

异常根源

你代码中的g.First()和g.Last()返回的是完整的DataRow对象,但OpeningBalance和ClosingBalance列的预期类型是Double,直接将整行对象赋值给数值类型列,必然触发类型转换失败的异常。

修正后的代码

将g.First()和g.Last()调整为提取对应列的具体数值:

DataTable ds2Sum = ds2.AsEnumerable()
    // 可选:若需按时间确定期初/期末,先按日期列排序(替换为你的实际日期列名)
    .OrderBy(r => Convert.ToDateTime(r["Date"]))
    .GroupBy(r => r["MaterialName"])
    .Select(g =>
    {
        var row = ds2.NewRow();

        row["MaterialName"] = g.Key;
        // 提取分组内第一行的OpeningBalance列值
        row["OpeningBalance"] = Convert.ToDouble(g.First()["OpeningBalance"]);
        row["Quantity"] = g.Sum(r => Convert.ToInt32(r["Quantity"]));
        // 提取分组内最后一行的ClosingBalance列值
        row["ClosingBalance"] = Convert.ToDouble(g.Last()["ClosingBalance"]);  

        return row;
    }).CopyToDataTable();
dataGridView2.DataSource = ds2Sum;

关键注意事项

  1. 明确列提取:必须通过g.First()["ColumnName"]的形式获取目标列的数值,而非直接返回整行对象。
  2. 类型匹配:因目标列是Double类型,用Convert.ToDouble()显式转换,避免隐式转换带来的类型不兼容问题。
  3. 排序保障:如果期初/期末是按时间顺序定义的,务必在GroupBy前对原数据按日期列排序,否则First()和Last()的结果可能不符合业务预期(分组后的行顺序依赖原DataTable的初始顺序)。

内容的提问来源于stack exchange,提问作者Kiran Kirtane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:20:26