2016-06-06 2 views
0

C#의 DataTables 및 열거 형 목록을 처음 사용합니다. 나는 많은 도움을 찾았지만이 문제는 어디서나 얻을 수없는 것 같습니다 .... 나는 간단한 테이블을 가지고 있습니다. 날짜, 코드, 가격은 시세 기호로 코드를 참조하십시오. 본질적으로이 날짜와 다음 날짜, 즉 특정 코드에 대한 날짜 t + 1/날짜 t 사이의 반품 또는 가격 변경을 계산하려고합니다. 그런 다음 테이블에 다시 추가하십시오. 다음Datatables/Enumerated Lists, C# 및 두 숫자의 차이 계산

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; 

} 

하지만 I : 나는 데이터 테이블 또는 열거 세트가 갈 수있는 방법입니다 있는지 확실하지 않습니다

은 아무도 덜 나는 DataTable을 처음으로 시도 설정은 아래 표를 작성하는 일을하지 문제를 해결하기 위해 목록을 사용하려 :

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처럼 쉽고 빠를 것이라고 기대 했었습니까?

답변

0

이 답변은 다음 언어로만 제공됩니다 : question. 코드는 동적 객체를 사용하므로 항상 느려집니다. GetData() 함수가 병목 현상을 발견하고 코드를 다시 팩터링하여 정적으로 알려진 데이터 형식 인 GetData을 전달할 수 있다고 생각합니다. 훨씬 빠르게 실행됩니다.

+0

안녕하세요 Alistair - 링크 및 참조 주셔서 감사합니다 -이 '확실히'내 이해를 돕는. 하지만 동적 인 Dataset을 tbl로 변환 한 다음 본질적으로 열거 형 목록을 열거하면 문제가 발생합니다. 나는 열거 된 것에 대한 나의 부족함이 주요 원인을 열거하지만 그렇게 생각한다. 다시 한번 감사드립니다. – 765tgs