簡體   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