2017-01-12 4 views
0

Excelからいくつかの行を処理し、クエリを実行し、いくつかの変数(12 var)に格納しています。 dtremoverowsには、Excelのデータが含まれています。動的変数をデータテーブルにバインドして再帰的に処理する

private System.Data.DataTable RemoveRows(System.Data.DataTable dtremoverows, bool mage) 
{ 
     System.Data.DataTable dtreturnrows = new System.Data.DataTable(); 
     int rowcount = dtremoverows.Rows.Count; 
     var RemoveRows1 = dtremoverows.AsEnumerable().Where(r => r["CRE_DATE"].ToString() == "" && r["EMP_NO/Emp_Name"].ToString() == "").ToList(); 
     var RemoveRows2 = dtremoverows.AsEnumerable().Where(r => r["CRE_DATE"].ToString() == "" && r["QTY"].ToString() == "").ToList(); 
     var RemoveRows3 = dtremoverows.AsEnumerable().Where(r => r["CRE_DATE"].ToString().Contains("Total in Group:") || r["QTY"].ToString().Contains("Total in Group:") || r["EMP_NO/Emp_Name"].ToString().Contains("Total in Group:") || r["WO_NO"].ToString().Contains("Total in Group:") || r["ROLE_CODE"].ToString().Contains("Total in Group:") || r["CATALOG_NO"].ToString().Contains("Total in Group:")).ToList(); 
     var RemoveRows4 = dtremoverows.AsEnumerable().Where(r => r["CRE_DATE"].ToString().Contains("Print Date/Time") || r["QTY"].ToString().Contains("Print Date/Time") || r["EMP_NO/Emp_Name"].ToString().Contains("Print Date/Time") || r["WO_NO"].ToString().Contains("Print Date/Time") || r["ROLE_CODE"].ToString().Contains("Print Date/Time") || r["CATALOG_NO"].ToString().Contains("Print Date/Time")).ToList(); 
     var RemoveRows5 = dtremoverows.AsEnumerable().Where(r => r["EMP_NO/Emp_Name"].ToString() == "" && r["QTY"].ToString() == "").ToList(); 
     var RemoveRows6 = dtremoverows.AsEnumerable().Where(r => r["CRE_DATE"].ToString() == "0" || r["EMP_NO/Emp_Name"].ToString() == "0" || r["CATALOG_NO"].ToString() == "0").ToList(); 
     var RemoveRows7 = dtremoverows.AsEnumerable().Where(r => r["CATALOG_NO"].ToString().Contains("Total Amount") || r["QTY"].ToString().Contains("Total Resource Count")).ToList(); 
     var RemoveRows8 = dtremoverows.AsEnumerable().Where(r => r["WO_NO"].ToString() == "" || r["QTY"].ToString() == "" || r["QTY"].ToString() == "0").ToList(); 
     var RemoveRows9 = dtremoverows.AsEnumerable().Where(r => r["EMP_NO/Emp_Name"].ToString() == "<None>" && (r["QTY"].ToString() == "" || r["CATALOG_NO"].ToString() == "")).ToList(); 
     var RemoveRows10 = dtremoverows.AsEnumerable().Where(r => r["WO_NO"].ToString() == "Work Ord" && r["EMP_NO/Emp_Name"].ToString() == "Employee #/Sales Part #").ToList(); 
     var RemoveRows11 = dtremoverows.AsEnumerable().Where(r => r["QTY"].ToString() == "0" || r["QTY"].ToString() == "").ToList(); 
     var RemoveRows12 = dtremoverows.AsEnumerable().Where(r => r["CRE_DATE"].ToString() == "" && r["WO_NO"].ToString() == "" && r["EMP_NO/Emp_Name"].ToString() == "" && r["ROLE_CODE"].ToString() == "" && r["CATALOG_NO"].ToString() == "" && r["QTY"].ToString() == "" && r["PLAN_LINE_NO"].ToString() == "" && r["WORK_ORDER_COST_TYPE"].ToString() == "" && r["WORK_ORDER_ACCOUNT_TYPE"].ToString() == "" && r["ORG_CODE"].ToString() == "" && r["CMNT"].ToString() == "").ToList(); 
} 

次に、それぞれの変数をループとして追加しています。私は私のコーディング(下記)が推奨されなくなったと思いますので、これを単一の再帰的ループとして使用できますか?その後、

try 
     { 

      if (RemoveRows1.Count() != 0) 
      { 
       foreach (var row in RemoveRows1) 
       { 
        dtremoverows.Rows.Remove(row); 

       } 
      } 
     } 
     catch { } 

     try 
     { 
      if (RemoveRows2.Count() != 0) 
      { 
       foreach (var row in RemoveRows2) 
       { 
        dtremoverows.Rows.Remove(row); 
       } 
      } 
     } 
     catch { } 

......... などなど... RemoveRows12件までとしてマージ:これは動作しますが、私は本当にこのコーディングのより良いアプローチの必要

dtreturnrows.Merge(dtremoverows); 

。ご提案があれば、お答えください。

答えて

1

多くの変数を使用するために、条件RemoveRows1RemoveRows2などのスニペットを詳しく見てください。なぜ条件を結合しないのですか?私はあなたがこのような何かを試してみて思う:

var rowsToRemove = dtremoverows.AsEnumerable() 
           .Where(r => 
           (/* Condition for RemoveRows1 */) || 
           (/* Condition for RemoveRows2 */) || 
           (/* Condition for RemoveRows3 */) || 
           (/* Condition for RemoveRows4 */)); 
// And so on you can add conditions so that you will get a collection 
// of all rows that should be deleted from the table 
// then iterate through those rows and perform delete like this: 

foreach (var row in rowsToRemove) 
{ 
    dtremoverows.Rows.Remove(row); 
} 

ご注意:これは提案ではない質問に対する正確な答えですが、それはコメントよりもだと答えとして掲示理由です。それが規則に違反しているなら私を許してください。

お手伝いします。

+0

こんにちは、私はExcelからさまざまな行から抽出しており、それらを維持する必要があるため、多くの変数を使用しています。あなたの提案をありがとう。あなたが他のものを持っているなら、私はそれを聞くのが大好きです。 –

+1

'LINQ'を使用しているので、whereの中で' various rows'を指定することができます。 –

+0

私はあなたのスニペットに従った。演算子を表示します。||ラムダとブール操作に使用することはできません –

0

親指の役割は、読み込みが不可能で分かりにくいために再帰を使用すべきではなく、再帰ループの深部まで到達するとスタックオーバーフロー例外が発生する可能性があるということです。

簡単なループを使用して反復を行う必要がある場合は、

関連する問題