Этот метод получает:
IEnumerable<object[]>
- в котором каждый массив имеет фиксированный размер (он представляет реляционную структуру данных).
DataEnumerable.Column[]
— некоторые столбцы метаданных, в основном они будут иметь одинаковое значение для всех строк.
Ожидаемый результат:
каждая «строка» должна получать значение для каждого из этих столбцов (поэтому структура данных остается реляционной).
private IEnumerable<object[]> BindExtraColumns(IEnumerable<object[]> baseData, int dataSize, DataEnumerable.Column[] columnsToAdd)
{
int extraColumnsLength = columnsToAdd.Length;
object[] row = new object[dataSize + extraColumnsLength];
string columnName;
int rowNumberColumnIndex = -1;
for (int i = 0; i < extraColumnsLength; i++)
{
//Assign values that doesn't change between lines..
// Assign rowNumberColumnIndex if row number column exists
}
//Assign values that change here, since we currently support only row number
// i'ts not generic enough
if (rowNumberColumnIndex != -1)
{
int rowNumber = 1;
foreach (var baseRow in baseData)
{
row[rowNumberColumnIndex] = rowNumber;
Array.Copy(baseRow, 0, row, extraColumnsLength, dataSize);
yield return row;
rowNumber++;
}
}
else
{
foreach (var baseRow in baseData)
{
Array.Copy(baseRow, 0, row, extraColumnsLength, dataSize);
yield return row;
}
}
}
этот метод можно вызывать из сотен потоков с относительно большими наборами данных, поэтому производительность здесь критична, и я старался создавать как можно меньше новых объектов.
Обратите внимание - это закрытый метод, который использует ТОЛЬКО BY DataReader, который читает каждую строку и передает ее в другой массив непосредственно перед чтением следующей строки.
Итак, здесь как-то оптимизировано копирование массивов, и должен ли я (осторожно) использовать память, чтобы ускорить работу здесь?
Спасибо