2017-12-19 4 views
-2

나는 프로그램을 작성했으며 올바르게 작동합니다. 하지만 문제는 처리하는 데 많은 시간이 걸리는 것입니다. 데이터 테이블에 수백만 개 이상의 데이터가 있습니다. 프로세스가 완료 될 때까지 기다리기가 정말 어렵습니다. 나는 LinQ 방법에 대해 듣는다. 그러나 나는 그것에 친숙하지 않다. 어느 누구라도 내 코드 속도를 높일 수 있습니까?C에서 중첩 된 for 루프 속도를 높입니다. #

foreach (var ch in lsCh) 
{ 
    foreach (var dt in lsDt) 
    { 
     foreach (var cs in lsCs) 
     { 
      DataRow[] result = Dtsrc.Select("Channel = '" + ch.ToString() + "' AND Date = '" + dt.ToString() + "' AND CPSTime = '" + cs + "'"); 

      if (result.Length > 0) 
      { 
       //Some calculation 
      } 

      Dtsrc.AcceptChanges(); 
     } 
    } 
} 
+1

을, 'lsDt'와'lsCs'? 너 거기서 뭘하려고하는거야? 어떤 코드를 던져서 다음과 같이 말할 수는 없습니다. LINQ는 또한 루프를 사용합니다. 일반적으로 가독성을 향상시키는 데 도움이됩니다. –

+0

도움을 받으려면 알고리즘과 반복되는 데이터에 대한 정보를 제공해야합니다. –

+0

그 목록입니다! 데이터 테이블 @ TimSchmelter에서이 목록으로 데이터를 필터링하려고합니다. – Shanmugarajan

답변

1

DataColumns와 목록의 유형이 명확하지 않으므로 적절하게 변경해야 할 수 있습니다. 그러나 어쨌든 이것은 더 효율적인 방법을 보여줍니다.

List<T> 대신 HashSet<T>을 사용합니다. 당신은 일반적으로 유형을 변경할 수없는 경우에는 생성자에 목록을 전달하여 인스턴스를 만들 수 있습니다

var setCh = new HashSet<int>(lsCh); 
var setDt = new HashSet<DateTime>(lsDt); 
var setCs = new HashSet<DateTime>(lsCs); 

지금이 쿼리는 훨씬 더 효율적이어야한다 :`lsCh`을 무엇

var rowsToProcess = Dtsrc.AsEnumerable() 
    .Where(r => setCh.Contains(r.Field<int>("Channel")) && setDt.Contains(r.Field<DateTime>("Date")) && setCs.Contains(r.Field<DateTime>("CPSTime"))); 

foreach (DataRow row in rowsToProcess) 
{ 
    //Some calculation 
} 
+0

도움을 많이 주셔서 감사합니다. 잘 작동하고있어. 네가 혼동해서 미안해! – Shanmugarajan