我是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);
它并没有崩溃,但它毫无希望地缓慢而且效率低下。
我的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一样简单快捷吗?
答案 0 :(得分:0)
阅读此question的答案。您的代码使用动态对象,这总是让这个变慢。我认为你会发现你的GetData()
函数是瓶颈,如果你可以重新编写代码,以便你可以传递GetData
一个静态已知的数据类型,它将运行得更快。