2016-07-18 5 views
-4

DataTable에서 데이터를 추출하여 원하는 형식의 DataTable로 변환하는 끔찍한 방법이 있습니다. LinQ에서이 작업을 수행하는 데 훨씬 좋은 방법이있을 것이라고 확신하지만 실제로 사용하지는 않았습니다. 누군가가 내게 더 좋은 해결책을 제시 할 수 있다면 고맙겠습니다. 조건이있는 중첩 for 루프를 LINQ로 변환하는 방법

을 Heres 코드가

private static void ExtractImportLayoutFromExcelDt(DataTable importDt, DataTable dtExtracted, int languages) 
    { 
     // The number of Locale colums included in the excel file. 
     for (int x = 0; x < languages; x++) 
     { 
      // The total number of friendlynames-keys/language included in the excel. 
      for (int j = 0; j < dtExtracted.Rows.Count; j++) 
      { 
       var row = dtExtracted.Rows[j]; 
       DataRow tempRow = importDt.NewRow(); 
       // Filling in the 3 columns. (FriendlyName - LocaleID - Text) 
       for (int i = 0; i <= 2; i++) 
       { 
        if (i == 0) 
        { 
         tempRow[i] = row[i];  // Friendly names: This is always going to be column 1 [0].       
        } 
        else if (i == 1) 
        { 
         tempRow[i] = Regex.Match(dtExtracted.Columns[x + 1].ToString(), @"\d+").Value; // LocaleIDs: Getting rid of non numeric characters from this column. 
        } 
        else 
        { 
         tempRow[i] = row[x + 1]; 
        } 
       } 
       importDt.Rows.Add(tempRow); 
      } 
     } 
    } 
+0

초보자의 경우 이러한 부적절한 변수를 모두 읽는 것은 어렵습니다 (주석이 필요하면 다시 작성하십시오). 지금까지 뭐라구? –

+0

Linq는'for'보다는'foreach'를 변환하는 것이 더 적합합니다. – juharr

+0

당신은 가장 안쪽의'for' 루프가 필요하다고 확신합니까? – bashis

답변

0

내가 다시 것이다 내부 for 루프

for (int x = 0; x < languages; x++)  
    foreach (DataRow row in dtExtracted.Rows)   
     importDt.Rows.Add 
     (
      row[0], 
      Regex.Match(dtExtracted.Columns[x + 1].ToString(), @"\d+").Value; // LocaleIDs: Getting rid of non numeric characters from this column. 
      row[x + 1] 
     ); 

DataTable.Rows 컬렉션 객체의 배열 동의 Add 방법의 과부하가 있습니다 Add

+0

이것도 훨씬 더 잘 보입니다. –

+0

@ SóskuthyAndrás,'importDt.Rows.Add'는 부작용을 만듭니다 (새로운 행 추가). Linq 질의를 사용하여'IEnumerable '데이터를 준비하더라도'foreach'가 여전히 행을 추가 할 필요가 있습니다. (길고 읽을 수 없을 것으로 예상됩니다) – ASh

0

내가 아니에요을 LINQ가 여기에 어떤 도움이 될지는 모르겠지만 전체 매핑 논리를 다시 작성하는 것 외에는

private static void ExtractImportLayoutFromExcelDt(DataTable importDt, DataTable dtExtracted, int languages) 
    { 
     // The number of Locale colums included in the excel file. 
     for (int x = 0; x < languages; x++) 
     { 
      // The total number of friendlynames-keys/language included in the excel. 
      for (int j = 0; j < dtExtracted.Rows.Count; j++) 
      { 
       AddRow(importDt, dtExtracted, dtExtracted.Rows[j], x+1); 
      } 
     } 
    } 

    private static void AddRow(DataTable table, DataTable dtExtracted, DataRow originalRow, int language) 
    { 
     var row = table.NewRow(); 
     row[0] = originalRow[0]; 
     row[1] = Regex.Match(dtExtracted.Columns[language].ToString(), @"\d+").Value; 
     row[2] = originalRow[language]; 
     table.Rows.Add(row); 
    } 
0

당신은 다음처럼 작성할 수 있지만,이 경우 더 Linq에의 학대처럼 그러나 당신이 교육 목적을 위해 그것을 할 경우 LINQ 용맹 한 주 전원이 원할 때입니다 : 적어도 두 가지로이 방법을 분할 이와 같은 경우가 아닌 컬렉션 예제를 열거하거나 필터링하십시오.

public static void ExtractImportLayoutFromExcelDt(DataTable importDt, DataTable dtExtracted, int languages) 
    { 
     Enumerable.Range(0, languages) 
      .ToList().ForEach(x => 
      { 
       Enumerable.Range(0, dtExtracted.Rows.Count) 
        .ToList().ForEach(j => 
        { 
         var row = dtExtracted.Rows[j]; 
         DataRow tempRow = importDt.NewRow(); 
         AddRow(importDt, dtExtracted, x, row, tempRow); 
        }); 
      }); 
    } 

    private static void AddRow(DataTable importDt, DataTable dtExtracted, int x, DataRow row, DataRow tempRow) 
    { 
     for (int i = 0; i <= 2; i++) 
     { 
      if (i == 0) 
      { 
       tempRow[i] = row[i];  // Friendly names: This is always going to be column 1 [0].       
      } 
      else if (i == 1) 
      { 
       tempRow[i] = Regex.Match(dtExtracted.Columns[x + 1].ToString(), @"\d+").Value; // LocaleIDs: Getting rid of non numeric characters from this column. 
      } 
      else 
      { 
       tempRow[i] = row[x + 1]; 
      } 
     } 
     importDt.Rows.Add(tempRow); 
    } 
+0

이 긴 LinQ 문은 읽기 쉽지 않고 중첩 된 루프와 물건입니다 그러나 나는 그것에 매달려있게하려고 노력할 것이다. –

관련 문제