繁体   English   中英

C# 在从 Int32 转换为 Int64 时复制具有同一 DataTable 中的值的列

[英]C# Copy Columns with values within the same DataTable while convert from Int32 into Int64

我有一个 DataTable(即 DT),它有几列字符串类型(即 colStr1、colStr2)和一些 Int32 类型(即 colInt1、colInt2)。 这是在 DB 以及在代码中创建的 DataTable 中设置的。

对于我的一个函数,我需要获取 Int 列的总和。 但是对于特定的数据,Sum 会超过 Int32.MaxValue。

我正在寻找的是两个选项:

  1. (不确定这是否可行)添加一行,该行将包含列的 SUM,同时将 SUM 单元格/字段的类型从 Int32 更改为 Int64。

  2. 将这些 Int32 列(包含所有值)的副本添加到相同的 DT,但将新列定义为 Int64 类型(并相应地转换数据)。 然后我可以为那些做一个 SUM。 我有以下代码,但不确定它是否是最优雅和最好的方法:

     DataColumn colBal64 = new DataColumn(); colBal64.ColumnName = "BalanceInt64"; colBal64.DataType = typeof(Int64); dt.Columns.Add(colBal64); for (int i = 0; i <= dt.Rows.Count - 1; i++) { DataRow dr = dt.Rows[i]; dr["BalanceInt64"] = dr["BalanceInt32"]; }

关于如何更好地解决这个问题的任何建议? 最好的方法是什么? 到目前为止,我发现只将整个 DT 复制到一个新的 DT 中,而不是在同一个 DT 中的 Column,同时转换为另一个类型。

您的第一种方法确实是不可能的。 假设您有两个 Int32 列,您可以有一个 Int64,然后将其按位拆分为两个 Int32,但如果您不需要存储总和,这似乎很麻烦。 (如果您确实需要存储总和,更好的方法是使用另一个表或其他表,具体取决于您需要存储该总和的确切程度。)

根据您编写此求和函数的准确程度,您应该能够将您的值加到 Int64 中,如果您正在使用 .Sum() 调用,则可以通过强制转换(如下所示)或仅使用聚合变量是一个 Int64 并向其中添加 Int32。 例如,以下在 C# 中可以正常工作:

using System;
using System.Data;

var bigNumTable = new DataTable();
var column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "the_number";
bigNumTable.Columns.Add(column);
for (int i=0; i<32; i++)
{
    var row = bigNumTable.NewRow();
    row["the_number"] = Int32.MaxValue;
    bigNumTable.Rows.Add(row);
}

try
{
    Console.Write($"Summing as Int32: {bigNumTable.AsEnumerable().Sum(row => row.Field<Int32>("the_number"))}");
}
catch (OverflowException)
{
    Console.WriteLine("Summing as Int32 resulted in an OverflowException");
}
Console.Write($"Summing after casting to an Int64: {bigNumTable.AsEnumerable().Sum(row => (Int64)row.Field<Int32>("the_number"))}");

它将以下内容打印到控制台:

Summing as Int32 resulted in an OverflowException
Summing after casting to an Int64: 68719476704

如果您需要用另一种语言进行求和,您应该能够在必要时将 Int32s 转换为 Int64s,但如果您甚至需要这取决于您正在编写的函数的上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM