Слияние 2 DataTables - PullRequest
       11

Слияние 2 DataTables

0 голосов
/ 25 ноября 2011

У меня есть 2 Datatable с этими полями:

DataTable1

Hour - Value1
0 - 34
1 - 22
2 - NULL
3 - 12
..
..
23 - 10

DataTable2

Hour - Value1
0 - NULL
1 - 22
2 - 35
3 - 11
..
..
23 - NULL

Мне нужно заполнить уникальный DataTable, который имеет тот же час"Поля (часы дня) и для значений должны получить значения из DataTable1, если не ноль.Если значения в Datatable1 равны NULL, я должен взять соответствующие значения из DataTable2.Если также значение из DataTable2 равно нулю, я должен записать ошибку.

Для моего примера мне нужно получить:

DataTableResult

Hour - Value1
0 - 34
1 - 22
2 - 35
3 - 12
..
..
23 - 10

Как я могу получить это?

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Использование Linq для объектов и допущение, что dataTable1 и dataTable2 имеют одинаковые столбцы:

var hoursMap1 = dataTable1.Rows.Cast<DataRow>().ToDictionary(row => row[0]);
var hoursMap2 = dataTable2.Rows.Cast<DataRow>().ToDictionary(row => row[0]);

var resultTable = new DataTable();

// Clone the column from table 1
for (int i = 0; i < dataTable1.Columns.Count; i++)
{
  var column = dataTable1.Columns[i];
  resultTable.Columns.Add(column.ColumnName, column.ColumnType);
}

foreach (var entry in hoursMap1)
{
  int hours = entry.Key;
  DataRow row1 = entry.Value;
  DataRow row2 = null;
  if (!hoursMap2.TryGetValue(hours, out row2))
  {
    // Hours in table 1 but not table 2, handle error
  }

  var fields = new object[resultTable.Columns.Count];
  int fieldIndex = 0;
  fields[fieldIndex++] = hours;

  for (int i = 1; i < row1.ItemsArray.Length; i++)
  {
    var field1 = row1.ItemsArray[i];
    var field2 = row2.ItemsArray[i];
    var newField = field1 ?? field2;
    if (newField == null)
    {
      // Field neither in table 1 or table 2, handle error
    }

    fields[fieldIndex++] = newField;
  }

  resultTable.Rows.Add(fields);
}
1 голос
/ 25 ноября 2011

Этот вопрос следует простой условной логике, которая потребуется для обработки каждого элемента в выражении foreach.

Вы хотите обработать его, чтобы каждый раз, когда элемент в строке имел значение NULL.Вы переходите к этой строке в datatable 2 и проверяете, имеет ли это значение, если это так, это становится новым значением в datatable 1. Если это не так, выдает ошибку.Я предоставил ссылку, как сравнивать , но на самом деле это вам не нужно, так как все, что вы делаете, это проверяете ноль в поле подряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...