2016-07-18 82 views
-4

我有一個可怕的方法,從DataTable中提取數據並將其轉換爲所需格式的DataTable。我相信在LinQ中有更好的方法來做到這一點,但我並沒有真正體驗過它。如果有人能給我一個更好的解決方案,我將不勝感激。如何將嵌套for循環與if條件轉換爲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++) 
      { 
       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更適合將'foreach'轉換爲'for'。 – 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

即使沒有linq,這看起來也好多了。 –

+0

@SóskuthyAndrás,'importDt.Rows.Add'創建一個副作用(添加新行)。它仍然需要'foreach'來添加行,即使我準備'IEnumerable '數據使用Linq查詢(我預計它會更長並且不可讀) – 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的..The主要動力是,當你想枚舉或過濾例如集合,而不是像這樣的情況。

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語句的可讀性較差,因此嵌套循環和內容但我會盡力去解決它。 –