繁体   English   中英

在列值的时间序列中 - 如果行值为null,如何使用先前的可用值。 c#(Datatable / Datarow)

[英]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.

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