このメソッドは以下を取得します。
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;
}
}
}
このメソッドは、比較的大きなデータ セットを持つ数百のスレッドから呼び出すことができるため、ここでのパフォーマンスは非常に重要であり、新しいオブジェクトをできるだけ最小限に抑えようとしました。
注 - これは、各行を読み取る DataReaderのみを使用するプライベート メソッドであり、次の行を読み取る直前に別の配列に渡します。
それで-ここで配列をコピーすると、ここで何らかの形で最適化されますか?ここで物事を後押しするために(慎重に)メモリを使用する必要がありますか?
ありがとう