我已经知道如何在datatable中添加数组。
string[] months = {"Jan" , "Feb" , "Mar" , "Apr" , "Jun"};
DataTable dt = new DataTable();
dt.Columns.Add("M1");
dt.Columns.Add("M2");
dt.Columns.Add("M3");
dt.Columns.Add("M4");
dt.Columns.Add("M5");
DataRow row = dt.NewRow();
for (int i = 0; i < months.Length; i++)
{
row[i] = months[i];
}
dt.Rows.Add(row);上面的代码工作得很好。但我有一个不同的问题。假设我有一个由8个值组成的数组。
string[] arr = {"1","2","3","4","5","6","7","8"};现在,我已经创建了一个包含4列的新datatable。
DataTable dt = new DataTable();
dt.Columns.Add("v1");
dt.Columns.Add("v2");
dt.Columns.Add("v3");
dt.Columns.Add("v4");
DataRow row = dt.NewRow();现在,我想将数组的值添加到以下列中
arr[0] = v1
arr[1] = v2
arr[2] = v3
arr[3] = v4
arr[4] = v1
arr[5] = v2
arr[6] = v3
arr[7] = v4更新1
我有一个函数,其中我想执行所有这些操作。
public string LoadAMIReadings(string startTS, string endTS, string batch, string divCode, string cc_code)
{
totalRec = 0;
processedRec = 0;
this.BATCH = batch;
this.DIVCODE = divCode;
this.CCCODE = cc_code;
this.FROMDATE = startTS;
this.TODATE = endTS;
HESservicesDoCommandRequest obj = new HESservicesDoCommandRequest();
DataTable dt = new DataTable();
dt.Columns.Add("Application_No", typeof(string));
dt.Columns.Add("REF_NO", typeof(string));
dt.Columns.Add("METER_SERIAL_NO", typeof(string));
dt.Columns.Add("XMETER_NO", typeof(string));
// here I want to call the modified solution
int rowCount = bill.Length / dt.Columns.Count; // array bill is declared globally with 7780 values in it
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
{
DataRow row = dt.NewRow();
for (int columnIndex = 0; columnIndex < dt.Columns.Count; columnIndex++)
{
// In case of 2 rows:
// row 1: (0 * 4) + 0 = 0
// row 1: (0 * 4) + 1 = 1
// row 1: (0 * 4) + 2 = 2
// row 1: (0 * 4) + 3 = 3
// row 2: (1 * 4) + 0 = 4
// row 2: (1 * 4) + 1 = 5
// row 2: (1 * 4) + 2 = 6
// row 2: (1 * 4) + 3 = 7
row[columnIndex] = bill[(rowIndex * dt.Columns.Count) + columnIndex];
}
dt.Rows.Add(row);
}
if (dt != null && dt.Rows.Count > 0)
{
totalRec = dt.Rows.Count;
string ReqEnvPath = System.Configuration.ConfigurationManager.AppSettings["ReadEnvPath"].ToString();
XElement SoapReqEnv = XElement.Load(ReqEnvPath);
foreach (DataRow dr in dt.Rows)
{
string uniqueID = dr["APPLICATION_NO"].ToString();
string meterNo = dr["METER_SERIAL_NO"].ToString();
string timestamp = DateTime.UtcNow.ToString("o");
StringBuilder sbArg0 = new StringBuilder();
try
{
sbArg0.AppendFormat(@"<?xml version=""1.0"" encoding=""UTF-8"" ?> " + SoapReqEnv.ToString(), uniqueID, startTS, endTS, timestamp, this.HEXURL, this.HEXUID, this.HEXPWD);
Guid currentGuid = Guid.NewGuid();
obj.getResponseAsync(sbArg0.ToString(), currentGuid + "$" + uniqueID);
obj.getResponseCompleted += this.myHandler;
string delayMS = System.Configuration.ConfigurationManager.AppSettings["DelayMS"].ToString();
ushort delay = 1000;
ushort.TryParse(delayMS, out delay);
System.Threading.Thread.Sleep(delay);
}
catch (Exception ex)
{
error += "Error for UniqID:" + uniqueID + "Desc:" + ex.Message + "\n";
}
finally
{
//System.Threading.Thread.CurrentThread.Join();
}
}
}
return error;
}我该怎么加呢?
发布于 2019-03-28 18:12:54
解决方案1
代码示例;这不是最好或最短的实现,但对于新手程序员来说,这是一个清晰易懂的实现。
string[] arr = { "1", "2", "3", "4", "5", "6", "7" };
int rowCount = arr.Length / dt.Columns.Count;
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
{
DataRow row = dt.NewRow();
for (int columnIndex = 0; columnIndex < dt.Columns.Count; columnIndex++)
{
// In case of 2 rows:
// row 1: (0 * 4) + 0 = 0
// row 1: (0 * 4) + 1 = 1
// row 1: (0 * 4) + 2 = 2
// row 1: (0 * 4) + 3 = 3
// row 2: (1 * 4) + 0 = 4
// row 2: (1 * 4) + 1 = 5
// row 2: (1 * 4) + 2 = 6
// row 2: (1 * 4) + 3 = 7
row[columnIndex] = arr[(rowIndex * dt.Columns.Count) + columnIndex];
}
dt.Rows.Add(row);
}解决方案2
一个更高级的edge-case-safe 和解决方案,它使用扩展方法将原始数组拆分为多个子数组并填充datatable。
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> Split<T>(this T[] array, int size)
{
for (var i = 0; i < (float)array.Length / size; i++)
{
yield return array.Skip(i * size).Take(size);
}
}
public static void FillDataTable<T>(this DataTable dataTable, T[] input)
{
IEnumerable<IEnumerable<T>> rowValues = input.Split(dataTable.Columns.Count);
foreach (IEnumerable<T> rowValue in rowValues)
{
DataRow row = dataTable.NewRow();
T[] cellValues = rowValue.ToArray();
for (int columnIndex = 0; columnIndex < cellValues.Length; columnIndex++)
{
// 'Safe'-check in case the original array didn't contain enough values. The cell value will remain 'null'
if (columnIndex < dataTable.Columns.Count)
{
row[columnIndex] = cellValues[columnIndex];
}
}
dataTable.Rows.Add(row);
}
}
}
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
int[] input = { 1, 2, 3, 4, 5, 6, 7, 8 };
DataTable dataTable = new DataTable();
dataTable.Columns.Add("v1");
dataTable.Columns.Add("v2");
dataTable.Columns.Add("v3");
dataTable.Columns.Add("v4");
dataTable.FillDataTable(input);
}
}发布于 2019-03-28 18:16:28
我的意思是你可以这样做:
DataRow row = null;
for (int i = 0; i < arr.Length; i++) {
if (i % 4 == 0)
{
row = dt.NewRow();
dt.Rows.Add(row);
}
row[i % 4] = arr[i];
}编辑:以此为例:
var arr = Enumerable.Range(1, 40).ToArray();
for (int i = 0; i < arr.Length; i++)
{
if (i % 4 == 0) { Console.WriteLine("new row"); }
Console.WriteLine($"row[{i % 4}] = arr[{i}];");
}产出如下:
new row
row[0] = arr[0];
row[1] = arr[1];
row[2] = arr[2];
row[3] = arr[3];
new row
row[0] = arr[4];
row[1] = arr[5];
row[2] = arr[6];
row[3] = arr[7];
new row
row[0] = arr[8];
row[1] = arr[9];
row[2] = arr[10];
row[3] = arr[11];
new row
row[0] = arr[12];
row[1] = arr[13];
row[2] = arr[14];
row[3] = arr[15];
...这就是你想要的,对吧?
发布于 2019-03-28 18:19:03
这对我有效,需要添加钩子的边缘情况,但概念是足够简单的。
string[] arr = { "1", "2", "3", "4", "5", "6", "7", "8" };
DataTable dt = new DataTable();
dt.Columns.Add("v1");
dt.Columns.Add("v2");
dt.Columns.Add("v3");
dt.Columns.Add("v4");
DataRow row = dt.NewRow();
int col = 0;
foreach (var val in arr)
{
if (col > 3)
{
col = 0;
dt.Rows.Add(row);
row = dt.NewRow();
row[col] = val;
}
else
{
row[col] = val;
col++;
}
}
dt.Rows.Add(row);https://stackoverflow.com/questions/55404097
复制相似问题