Nano Hash - криптовалюты, майнинг, программирование

ImportRow() не копирует DataRows в DataTable в C#

У меня есть две таблицы, которые я хочу «соединить» вместе. В первом есть все столбцы, что и во втором, но данные неполные. У обеих таблиц есть идентификатор, который я буду использовать, чтобы сшить их вместе. Слияние не работает, так как во второй таблице больше строк и она содержит одинаковые идентификаторы в разное время.
Этот пример пояснит это лучше:

OldTable1:
+----+-------+---------+--------+
| ID | Name  | PhoneNr | Address|  
+----+-------+---------+--------+
| 1  | Tim   | 0       |        |  
+----+-------+---------+--------+
| 2  | Frank | 0       |        | 
+----+-------+---------+--------+

OldTable2
+----+---------+--------+
| ID | PhoneNr | Address|  
+----+---------+--------+
| 1  | 12345   | Avenue |  
+----+---------+--------+
| 1  | 67890   | Street | 
+----+---------+--------+
| 2  | 55555   | Alley  | 
+----+---------+--------+

NewTable:
+----+-------+---------+---------+
| ID | Name  | PhoneNr | Address |
+----+-------+---------+---------+
| 1  | Tim   | 12345   | Avenue  |
+----+-------+---------+---------+
| 1  | Tim   | 67890   | Street  |
+----+-------+---------+---------+
| 2  | Frank | 55555   | Alley   |
+----+-------+---------+---------+

Вот мой код:

DataTable newTable = oldTable1.Clone();

    foreach (DataRow drOld1 in oldTable1.Rows)
    {
        foreach (DataRow drOld2 in oldTable2.Rows)
        {
            if (drOld1["ID"].Equals(drOld2["ID"]))
            {
                DataRow newRow = oldTable1.NewRow();
                newRow.ItemArray = drOld1.ItemArray.Clone() as object[];

                newRow["PhoneNr"] = drOld2["PhoneNr"];
                newRow["Address"] = drOld2["Address"];
                newTable.ImportRow(newRow);
            }
        }
    }

Я не могу сказать, что не так. Кажется, все работает, пока я не дойду до строки с ImportRow. newRow включает всю правильную информацию, просто не добавляет строку в newTable. Я просмотрел несколько связанных вопросов, и ни один из ответов не решает мою проблему. Я не могу заменить ImportRow() на Add(), так как это другой DataTable. OldTable1 и newTable имеют одинаковые столбцы, потому что я создал newTable, клонируя схему из OldTable1. Что мне здесь не хватает?

РЕШЕНИЕ:
Как правильно указал aguertin, причина, по которой он не работал, заключалась в следующем:

Метод NewRow() отсоединяет строку, что приводит к игнорированию метода ImportRow() и исключению генерации исключения.

Мое личное решение заключалось в использовании старых строк первой таблицы вместо создания новой. Теперь все работает как задумано.

DataTable newTable = oldTable1.Clone();

        foreach (DataRow drOld1 in oldTable1.Rows)
        {
            foreach (DataRow drOld2 in oldTable2.Rows)
            {
                if (drOld1["ID"].Equals(drOld2["ID"]))
                {
                    drOld1["PhoneNr"] = drOld2["PhoneNr"];
                    drOld1["Address"] = drOld2["Address"];
                    newTable.ImportRow(drOld1);
                }
            }
        }
07.12.2016

  • Кажется, все работает, пока я не доберусь до строки с ImportRow. и что дальше? 07.12.2016
  • Я почти уверен, что это потому, что клонированная строка отсоединена, а отдельные строки не могут быть импортированы. Он также не генерирует исключение, он просто игнорирует его. 07.12.2016
  • Точно ничего не происходит. Отключено, потому что я создал его с помощью NewRow() из другой таблицы? 07.12.2016

Ответы:


1

Метод NewRow() отсоединяет строку, что приводит к игнорированию метода ImportRow() и исключению генерации исключения.

Используйте Add().... даже если вы говорите, что не можете просто создать временный словарь/таблицу и сохранить там значения.

07.12.2016
  • На самом деле это правильный ответ. Благодарю вас! К сожалению, я не смог заставить его работать с помощью функции Add(). Я заменил newTable.ImportRow(newRow); на newTable.Rows.Add(newRow);, и это дает мне следующую ошибку: В System.Data.dll произошло необработанное исключение типа «System.ArgumentException». Дополнительная информация: эта строка уже принадлежит другой таблице. Я мог бы решите это по-другому, как вы можете видеть в моем редактировании, хотя 14.12.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..