Вот некоторый псевдокод для алгоритма преобразования. Обратите внимание, что это требует сканирования всего набора данных дважды; Есть несколько других возможностей для повышения эффективности, например, если входные данные могут быть отсортированы. Кроме того, поскольку это псевдокод, я не добавил обработку для нулевых значений.
var columnNames = new HashSet<string> { "pn_id" };
foreach (var record in data)
columnNames.Add(record.question_id.ToString());
var table = new DataTable();
foreach (var name in columnNames)
table.Columns.Add(new DataColumn(name, typeof(string)));
foreach (var record in data)
{
var targetRecord = CreateNewOrGetExistingRecord(table, record.pn_id);
targetRecord[record.question_id.ToString()] = record.char_value ?? record.date_value.ToString();
}
А вот эскиз вспомогательного метода:
DataRow CreateNewOrGetExistingRecord(DataTable table, object primaryKeyValue)
{
var result = table.Find(primaryKeyValue);
if (result != null)
return result;
//add code here to create a new row, add it to the table, and return it to the caller
}