【问题标题】:Check and replace the values in each cell of a DataTable using ItemArray使用 ItemArray 检查并替换 DataTable 的每个单元格中的值
【发布时间】:2019-05-16 21:48:26
【问题描述】:

我有一个有 10 列的 datatable。我必须检查每列中的单元格值是否包含值 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");
            }
        }
}

但值不会被替换。为什么会这样?这段代码有什么错误?

【问题讨论】:

  • 这不仅仅是替换字符串。这个问题还有一个重要的点,回答者忽略了这一点。为 item 数组的元素赋值或为指向列值的变量赋值是没有用的 → var item = row.Columns[i]; item = "something";错误)。他们应该像这样替换整个项目数组row.ItemArray = anotherArray; 或直接为列值分配一些东西:row.Columns[i] = "something";
  • 尝试替换整个ItemArray属性时的另一个重要点→如果存在只读列,则设置项目数组将引发异常。
  • @RezaAghaei 感谢您强调这些要点。它很有帮助。

标签: c# asp.net .net datatable


【解决方案1】:

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

  • 为项目数组的元素赋值不会改变列值。
  • 为包含列值的变量赋值不会改变列值。
  • 要使用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";
    }
}

【讨论】:

    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2018-08-16
    • 2011-04-13
    • 2017-01-26
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多