Слияние DataTables - без учета первой строки - PullRequest
0 голосов
/ 20 июля 2011

Как я могу объединить объекты DataTable, игнорируя первую строку?

Данные, которые мне нужно объединить, с данными, полученными мной, получены из проанализированного файла CSV, и его первая строка (иногда) по-прежнему содержит заголовки,которые явно не должны попадать в итоговую таблицу ... Метод *

DataTable.Merge , по-видимому, не предлагает такой возможности.Какой лучший способ сделать это?Просто удалить первый ряд заранее?Но это влияет (изменяет) «оригинал», и что, если я хочу, чтобы он остался таким, как был.Удаление и повторная вставка после слияния?Пахнет как "умное кодирование".Неужели нет лучшего способа?

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Редактирование моего предыдущего

Я написал код в похожих строках и в итоге все строки dt1 остались целыми, а dt2 содержал только строки 2 и 3 из dt1

var dt1 = new DataTable("Test");
dt1.Columns.Add("id", typeof(int));
dt1.Columns.Add("name", typeof(string));

var dt2 = new DataTable("Test");
dt2.Columns.Add("id", typeof(int));
dt2.Columns.Add("name", typeof(string));

dt1.Rows.Add(1, "Apple"); dt1.Rows.Add(2, "Oranges");
dt1.Rows.Add(3, "Grapes");
dt1.AcceptChanges();

dt1.Rows[0].Delete();
dt2.Merge(dt1);
dt2.AcceptChanges(); 
dt1.RejectChanges();

Дайте мне знать, если вы сочтете это приемлемым.

Виджай

1 голос
/ 20 июля 2011

Вы можете пройти по строкам отдельно и объединить их в таблицу, что-то вроде

public static class DataTableExtensions
{
    public static void MergeRange(this DataTable dest, DataTable table, int startIndex, int length)
    {
        List<string> matchingColumns = new List<string>();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            // Only copy columns with the same name and type
            string columnName = table.Columns[i].ColumnName;
            if (dest.Columns.Contains(columnName))
            {
                if (dest.Columns[columnName].DataType == table.Columns[columnName].DataType)
                {
                    matchingColumns.Add(columnName);
                }
            }
        }

        for (int i = 0; i < length; i++)
        {
            int row = i + startIndex;
            DataRow destRow = dest.NewRow();
            foreach (string column in matchingColumns)
            {
                destRow[column] = table.Rows[row][column];
            }
            dest.Rows.Add(destRow);
        }
    }
}
...