使用ItemArray检查并替换DataTable每个单元格中的值

时间:2018-12-16 05:50:57

标签: c# asp.net .net datatable

我有一个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");
            }
        }
}

,但不会替换这些值。为什么会这样呢?此代码有什么错误?

1 个答案:

答案 0 :(得分:2)

替换字符串不是问题的重点。有一些重要的要点,其他答案则将其忽略。

  • 将值分配给item数组的元素不会更改列值。
  • 将值分配给包含列值的变量不会更改列值。
  • 要使用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";
    }
}