[英]In a timeseries of column values - how can i use previous available value if row value is null. c# (Datatable/Datarow)
我正在将Datatable列值读入数组,但我当前的代码会跳过空值。
题 -
如何在下面列出的代码中实现以下功能 -
如果为null,则读取时间系列中的上一个可用值。
**例如 - 请注意这些是列值.... **
输入 - 8,9,10,'','',5,11,3,'',2
代码输出 - 8,9,10,5,11,3,2
Expect_Result - 8,9,10,10,10,5,11,3,3,2
代码 -
public static double[] DataTableColumn(DataTable table, string "dbColumn")
{
var column = new List<string>();
foreach (
string columnsize in
from DataRow resultRow in table.Rows
select resultRow[columnName].ToString().Split('|') into sizes
from size in sizes
where !column.Contains(size)
select size)
{
column.Add(columnsize);
}
string[] columnarray = column.ToArray();
double[] doublearray = Array.ConvertAll(columnarray, Double.Parse);
return doublearray;
}
FYI - DataTableColumn输入DataTable表来自以下代码
public static DataTable DataSet()
{
string sql = string.Format(@"select * from dbtable);
System.Data.DataTable table = new System.Data.DataTable();
using (OracleConnection connection = new OracleConnection())
{
connection.ConnectionString = connectionString;
connection.Open();
OracleCommand command = connection.CreateCommand();
command.CommandText = sql;
OracleDataReader reader = command.ExecuteReader();
table.TableName = "Table";
OracleDataAdapter adapter = new OracleDataAdapter(command);
adapter.Fill(table);
Console.WriteLine("State: {0}", connection.State);
Console.WriteLine("ConnectionString: {0}",
connection.ConnectionString);
}
return table;
}
以下代码使用您提供的输入生成所需的输出。
我对你的代码所做的改变是,当值为空时,它递归地找到前一个非空的值。
static void Main(string[] args)
{
var dt = new DataTable();
dt.Columns.Add(new DataColumn("column1"));
var values = new string[] { "8", "9|10", "", "", "5", "11", "3", "", "2" };
foreach (var value in values)
dt.Rows.Add(value);
var result = DataTableColumn(dt, "column1");
// result contains 8, 9, 10, 10, 10, 5, 11, 3, 3, 2
Console.ReadKey(true);
}
public static double[] DataTableColumn(DataTable table, string columnName)
{
var split = table.Rows.Cast<DataRow>()
.SelectMany(r => r[columnName].ToString().Split('|'))
.ToList();
var replaceEmpty = split.Select((v, i) =>
string.IsNullOrEmpty(v) ? Previous(split, i) : v)
.ToArray();
return Array.ConvertAll(replaceEmpty, Double.Parse);
}
public static string Previous(List<string> list, int index)
{
if (index == 0)
throw new IndexOutOfRangeException();
var prev = list[index - 1];
if (string.IsNullOrEmpty(prev))
return Previous(list, index - 1);
else
return prev;
}
如果你知道哪些列可以为null,那么它的简单就可以在sql中编写类似的内容
Data_table_column - 8,9,10,'','',5,11,3,'',2
select col1, col2, col3,
ISNULL(col4,col3)col4,ISNULL(col5,col3)col5, col6, col7, col8,
ISNULL(col9,col8) col9, col10 from #tttt
或者您可以在代码中更新数组以检查元素是否为空/空,然后设置array[arrayIndex] = array[arrayIndex-1]
的值array[arrayIndex] = array[arrayIndex-1]
希望这会给你一些想法
public static double[] GetColumnTimeSeriesFromDataTable(DataTable table, string columnName)
{
var split = table.Rows.Cast<DataRow>()
.SelectMany(r => r[columnName].ToString().Split('|'))
.ToList();
var replaceEmpty = split.Select((v, i) =>
string.IsNullOrEmpty(v) ? Previous(split, i) : v)
.ToArray();
return Array.ConvertAll(replaceEmpty, Double.Parse);
}
public static string Previous(List<string> list, int index)
{
var prev = list[index];
if (index == 0 & string.IsNullOrEmpty(list[index]))
return Previous(list, index+1);
else if (string.IsNullOrEmpty(prev))
return Previous(list, index - 1);
else
return prev;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.