我有一个datatable
,其中有10列。我必须检查每个列中的单元格值是否包含值A或D,如果是这样,则必须分别将“ A”替换为“ 150”,将“ D”替换为“ 250”。
我正在尝试这个::
foreach (DataRow dr in dt.Rows)
{
foreach(var item in dr.ItemArray)
{
if( item.ToString()=="A")
{
item.ToString().Replace("A", "150");
}
if (item.ToString() == "D")
{
item.ToString().Replace("A", "250");
}
}
}
,但不会替换这些值。为什么会这样呢?此代码有什么错误?
答案 0 :(得分:2)
替换字符串不是问题的重点。有一些重要的要点,其他答案则将其忽略。
ItemArray
替换列值,您需要为ItemArray
属性分配一个新数组。ItemArray
属性时,如果有一个只读列,则设置项数组将引发异常。Replace
方法将返回结果替换后的字符串,而不会更改源字符串。仅是为了让您的信息对ItemArray
属性有更好的了解,这是该属性的工作方式(简而言之):
Public object[] ItemArray {
get {
var values = new object[Columns.Count];
for (int i = 0; i < values.Length; i++) {
values[i] = Columns[i];
}
return values;
}
set {
for (int i = 0; i < values.Length; i++) {
//Checks if the column is writable and value is valid
Columns[i] = value[i];
}
}
}
您也可以阅读整个source code。
因此,结论是,以下代码段是错误的,对您无济于事:
row.ItemArray[i] = "something";
→不会更改列[i] var item = row[i]; item = "something";
→不会更改列[i] var s = "something"; s.Replace("s", "x");
→不会更改s
。 示例-使用ItemArray
请注意,如果数据表中有一个只读列,则以下代码将引发异常:
foreach (DataRow r in dt.Rows)
{
var a = r.ItemArray;
for (int i = 0; i < dt.Columns.Count; i++)
{
if ($"{a[i]}" == "A") // if($"{a[i]}".Contains("A"))
a[i] = "150"; // a[i] = $"{a[i]}".Replace("A", "150");
if ($"{a[i]}" == "D")
a[i] = "250";
}
r.ItemArray = a;
};
示例-使用列索引器
foreach (DataRow r in dt.Rows)
{
foreach (DataColumn c in dt.Columns)
{
if (c.ReadOnly)
continue;
if ($"{r[c]}" == "A") // if($"{r[c]}".Contains("A"))
r[c] = "150"; // r[c] = $"{r[c]}".Replace("A", "150");
else if ($"{r[c]}" == "D")
r[c] = "250";
}
}