datatable没有这个属性AsEnumerable() C# 计算查询回来的datatable中谋2列的数据总和,然后计算这2列sum之间的比值,就是相除,获取的2列总和,和相处的值写入第二个数据表中,这个第二个数据表存在这一行就更新,不存在这一行数据就新增数据
时间: 2024-11-06 20:13:35 浏览: 29
在C#中,如果你想要计算DataTable中的两列数值总和并找出它们的比例,可以按照以下步骤操作:
首先,确保你有一个DataTable对象`sourceTable`包含你需要计算的列。假设这两列分别是`Column1`和`Column2`。
1. 定义一个新的DataTable `resultTable` 来存放结果,如果有则先检查是否已存在需要更新的行。
```csharp
var resultTable = new DataTable();
if (resultTable.Ready)
{
// 如果resultTable存在并且有你要查找的行,可以添加条件判断来更新现有行
}
```
2. 创建一个匿名类型或一个新的DataRow用于存储临时计算结果,包括两列的总和和它们的比例。
```csharp
var sumRow = new { Column1Sum = 0, Column2Sum = 0, Ratio = 0 };
```
3. 遍历源DataTable,累加每行的`Column1`和`Column2`的值,并计算比例。
```csharp
foreach (DataRow row in sourceTable.Rows)
{
sumRow.Column1Sum += Convert.ToDouble(row["Column1"]);
sumRow.Column2Sum += Convert.ToDouble(row["Column2"]);
if (!double.IsNaN(sumRow.Column1Sum) && !double.IsNaN(sumRow.Column2Sum))
{
sumRow.Ratio = sumRow.Column1Sum / sumRow.Column2Sum;
}
}
// 更新或插入resultTable,这里假设"KeyColumn"是唯一标识行的列名
var key = Convert.ToInt32(sourceTable.Rows[0]["KeyColumn"]); // 从第一行获取键值
var existingRow = resultTable.AsEnumerable().FirstOrDefault(r => r.Field<int>("KeyColumn") == key);
if (existingRow != null)
{
existingRow["Ratio"] = sumRow.Ratio;
}
else
{
resultTable.ImportRow(sumRow);
}
```
4. 最后,你可以选择保存或输出`resultTable`,例如到数据库或文件中。
请注意,`AsEnumerable()`方法在.NET Framework中实际上是从`System.Data.Linq.Queryable`引入的,而并非直接作用于DataTable。上述代码中,我们假设使用的是.NET Framework,如果是LINQ to DataSet,则应使用`AsEnumerable`。如果是在.Net Core环境下,你应该使用`ToEnumerable()`方法。
阅读全文