我有一個數據表,其中包含一些值爲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辦呢?
我有一個數據表,其中包含一些值爲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辦呢?
由於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];
}
而且你去那裏。
現在,改變每個單元格的值是在DataTable
0
到DBNull
,你可以簡單地調用方法:
dtChangeZeroToNull (dataTable);
注:好像DataTable.Rows
和DataTable.Columns
沒有實現LINQ
Select
。否則,我們就可以馬上做到這一點
List<string> dtcolumnNames = dataTable.Columns.Select(x => x.ToString());
,而不需要Cast<DataColumn>
你必須這樣做。
//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"]);
}
鏈接的是_querying_不_updating_。你可以將你的數據投影到一個_new_'DataTable'上,但是使用循環沒有任何問題。或者改變填充'DataTable'的查詢。 –