Проверьте и замените значения в каждой ячейке DataTable, используя ItemArray - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть 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 голосов
/ 16 декабря 2018

Замена строки - не весь вопрос.Есть несколько важных моментов, которые игнорируются другими ответами.

  • Присвоение значения элементу массива элементов не изменит значение столбца.
  • Присвоение значения переменной, содержащей значение столбца, не изменит значение столбца.
  • Чтобы заменить значения столбца с помощью 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];
        }
    }
}

Вы можете прочитать все исходный код .

Итак, следующие фрагменты кода неверны и ничего не сделают для вас:

  • Неправильно: 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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...