2014-09-05 82 views
0

我需要消除的是包含string notUsedstring notUsed2,其中特定身份是2檢查是否DataRow的細胞部分包含串

我使用foreach循環來完成此所有的行,事先附加任何的至我的數據到一個stringbuilder。

我會選擇像這樣的方法:

foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     int auth = (int)dr[0]; 
     if (auth == 2) continue; 
     string notUsed = "NO LONGER USED"; 
     string notUsed2 = "NO LONGER IN USE"; 

     if (dr.Cells[3].ToString().Contains(string)notUsed) 
     { 
      dr.Delete(); 
     } 
     else 
     { 
      if (dr.Cells[3].ToString().Contains(string)notUsed2) 
      { 
       dr.Delete(); 
      } 
     } 
    } 

然而,上面是......完全錯誤的。對我來說這似乎合乎邏輯,但我不太明白如何以C#理解的方式來形成該方法。

+2

剛剛從刪除'string'包含這樣的:'如果(DR [3 ]的ToString()。包含(NOTUSED))'。你也試圖通過刪除行來修改'foreach'循環中的集合。它會引發異常。使用'for'循環,如果以相反的順序使用它,效果更好 – Habib 2014-09-05 13:54:45

+0

@Habib,但是我用什麼來代替'Cells'? – Wolfish 2014-09-05 13:56:37

+1

剛剛刪除'Cells'它應該是'dr [3]' – Habib 2014-09-05 13:59:32

回答

1

你應該

  • 刪除Cells因爲它不是改用 dr[3]DataRow的屬性。
  • 取下string包含你的支票應該是這樣的:if (dr[3].ToString().Contains(notUsed))
  • 要修改的集合foreach循環中,刪去該行。您應該向後使用for循環。

像:

for (int i = ds.Tables[0].Rows.Count - 1; i >= 0; i--) 
{ 
    DataRow dr = ds.Tables[0].Rows[i]; 
    int auth = (int)dr[0]; 
    if (auth == 2) continue; 
    string notUsed = "NO LONGER USED"; 
    string notUsed2 = "NO LONGER IN USE"; 

    if (dr[3].ToString().Contains(notUsed)) 
    { 
     dr.Delete(); 
    } 
    else 
    { 
     if (dr[3].ToString().Contains(notUsed2)) 
     { 
      dr.Delete(); 
     } 
    } 
} 

您還可以使用LINQ to DataSet,並得到一個新的DataTable,如:

DataTable newDataTAble = ds.Tables[0].AsEnumerable() 
          .Where(r => !r.Field<string>(3).Contains(notUsed) && 
             r.Field<string>(3).Contains(notUsed2)) 
          .CopyToDataTable();