2016-01-09 67 views
2

我有一個數據表,其中包含一些值爲0。現在我想用null或「」替換所有的0。datatable通過LINQ替換零空或空字符串

樣品的DataTable

A  B  C 
6  0  7 
0  7  0 
5  0  4 

預計

A  B  C 
6    7 
     7   
5    4 

我可以通過做for循環,但它可以通過LINQ辦呢?

+3

鏈接的是_querying_不_updating_。你可以將你的數據投影到一個_new_'DataTable'上,但是使用循環沒有任何問題。或者改變填充'DataTable'的查詢。 –

回答

2

由於LINQ支持查詢和更新不及時,你能做的最好的是利用自己的查詢來獲得一個DataTable的所有列的信息,然後更新您的細胞一個接一個。

一種方式來做到這一點是通過實現其輸入是DataTable做任務的方法:

private void dtChangeZeroToNull (DataTable dataTable){ 
    List<string> dcNames = dataTable.Columns 
          .Cast<DataColumn>() 
          .Select(x => x.ColumnName) 
          .ToList(); //This querying of the Column Names, you could do with LINQ 
    foreach (DataRow row in dataTable.Rows) //This is the part where you update the cell one by one 
     foreach (string columnName in dcNames) 
      row[columnName] = (int)row[columnName] == 0 ? DBNull.Value : row[columnName];    
} 

而且你去那裏。

現在,改變每個單元格的值是在DataTable0DBNull,你可以簡單地調用方法:

dtChangeZeroToNull (dataTable); 

注:好像DataTable.RowsDataTable.Columns沒有實現LINQSelect。否則,我們就可以馬上做到這一點

List<string> dtcolumnNames = dataTable.Columns.Select(x => x.ToString()); 

,而不需要Cast<DataColumn>

3

你必須這樣做。

//I am constructing a data table here. You already have this I guess. 
     var dataTable = new DataTable(); 
     dataTable.Columns.Add(new DataColumn("A", typeof(int)) { AllowDBNull = true }); 
     dataTable.Columns.Add(new DataColumn("B", typeof(int)) { AllowDBNull = true }); 
     dataTable.Columns.Add(new DataColumn("C", typeof(int)) { AllowDBNull = true }); 

//Assign values 
     DataRow row1 = dataTable.NewRow(); 
     row1["A"] = 6; 
     row1["B"] = 0; 
     row1["C"] = 7; 
     dataTable.Rows.Add(row1); 

     DataRow row2 = dataTable.NewRow(); 
     row2["A"] = 0; 
     row2["B"] = 7; 
     row2["C"] = 0; 
     dataTable.Rows.Add(row2); 

     DataRow row3 = dataTable.NewRow(); 
     row3["A"] = 5; 
     row3["B"] = 0; 
     row3["C"] = 4; 
     dataTable.Rows.Add(row3); 

//This is what you need. 
     foreach (DataRow row in dataTable.Rows) 
     { 
      if ((int)row["A"] == 0) 
      { 
       row["A"] = DBNull.Value; 
      } 
      if ((int) row["B"] == 0) 
      { 
       row["B"] = DBNull.Value; 
      } 
      if ((int) row["C"] == 0) 
      { 
       row["C"] = DBNull.Value; 
      } 
     } 

//test the changes 
     foreach (DataRow row in dataTable.Rows) 
     { 
      Console.WriteLine("" + row["A"] + "; " + row["B"] + "; " + row["C"]); 
     }