数据表/枚举列表,C#并计算两个数字之间的差异

时间:2016-06-06 22:28:47

标签: c# sql datatables enumerated-types

我是C#中的DataTables和Enumerated列表的新手。我已经查了很多帮助,但似乎无法解决这个问题,这是.... 我有一个简单的表日期,代码,价格看到代码作为股票代码。我基本上试图计算这个日期和下一个日期之间的价格的回报或变化,即特定代码的日期t + 1 /日期t。然后将其添加回表格。

我不确定Datatable或Enumerated集是否可行,但我首先尝试使用DataTable,下面的设置可以创建表:

private static DataTable GetData(dynamic Dataset)
{
    DataTable tbl = new DataTable();

    tbl.Columns.Add("EvalDate", typeof(DateTime));
    tbl.Columns.Add("Code", typeof(string));
    tbl.Columns.Add("Price", typeof(double));
    tbl.Columns.Add("Return", typeof(double));

    for (int irow=2;irow<Dataset.GetLength(0); irow++)
    {
        if (Dataset[irow,1] == null) { break; }
        DateTime EvalDate = DateTime.FromOADate((double)(Dataset[irow, 1]));
        string code = (string)(Dataset[irow, 2]); 
        double price = (double)Dataset[irow,3];                

        tbl.Rows.Add(EvalDate,code,price,null);

    }

    return tbl;

}

但我尝试使用列表来解决问题:

var Dataset = getRng("A1:E50000", "Data");
DataTable tbl = GetData(Dataset);   
var uniquecodes = (from items in tbl.AsEnumerable()
                select items["Code"]).Distinct().ToList();
List<object> Running = new List<Object>();

    foreach (var code in uniquecodes)
    {
        var ts = (from items in tbl.AsEnumerable()
                  orderby items.Field<DateTime>("EvalDate")
                  where items.Field<string>("Code") == (string)code
                  select items);

        ts.ElementAt(0).SetField<double>("PriceRet", 1);

        for (int idx = 1; idx < ts.Count(); idx++)
        {

            double price0 = ts.ElementAt(idx - 1).Field<double>("Price");
            double price1 = ts.ElementAt(idx).Field<double>("Pice");
            double delta = price1 / price0;

            ts.ElementAt(idx).SetField<double>("PriceRet", delta);                       

        }
        Running.Add(ts);

它并没有崩溃,但它毫无希望地缓慢而且效率低下。

数据如下所示: enter image description here

我的SQL知识很好,但我努力将其转化为如上所述的可行代码。任何帮助将不胜感激。

所以我实现了预期的结果,但通过SQL .... 我使用了以下语句/查询:

select  row_number() over (partition by[Code] order by [EvalDate]) [Id], 
        [Evaldate], [Code], [Price]

into #TEMP
from  MyTable

where  Code in ('AAA','BBB','CCC'); -- The list of codes to calc the return for ...

select T1.[EvalDate],T1.[Code],T1.[Price]/T.[Price] as [Delta]
from    #TEMP T1
        inner join #TEMP T
            on T1.Id = T.Id +1
            and T1.Code = T.Code 

drop table #TEMP

然后,这正确地给了我一个不透明的列表,其中包含了每个日期变更的适用价格变化。

我原本预计DataTable会像SQL一样简单快捷吗?

1 个答案:

答案 0 :(得分:0)

阅读此question的答案。您的代码使用动态对象,这总是让这个变慢。我认为你会发现你的GetData()函数是瓶颈,如果你可以重新编写代码,以便你可以传递GetData一个静态已知的数据类型,它将运行得更快。