私はC#4.0を使用しています。の各行で一連の計算を実行していSystem.Data.DataTable
ます。実際のコードを示すことはできませんが、要約すると次のようになります。
DataTable table = GetMyTableFromSomewhere();
string[] columnNames = table.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToArray();
foreach (var row in table.Rows.Cast<DataRow>())
{
Dictionary<string, object> values = columnNames.ToDictionary(c => c, c => row[c]);
EvaluateExpressionUsingTheseValues(values);
}
次に、経由でEvaluateExpressionUsingTheseValues
アクセスします。"SomeColumn"
values["SomeColumn"]
私の考えでは、ループ内で辞書を作成するとリソースが大量に消費されます。したがって、次のような方が時間効率がよい場合があります。
DataTable table = GetMyTableFromSomewhere();
int rowIndex = -1;
var values = table.Columns.Cast<DataColumn>().Select(c => new
{
Key = c.ColumnName,
Value = new Func<object>(() => table.Rows[rowIndex][c.ColumnName])
}).ToDictionary(kv => kv.Key, kv => kv.Value);
for (rowIndex = 0; rowIndex < table.Rows.Count; rowIndex++)
{
EvaluateExpressionUsingTheseValues(values);
}
そして、values["SomeColumn"]
inEvaluateExpressionUsingTheseValues
はvalues["SomeColumn"]()
代わりに , になります。
1 つ目は、辞書を作成するための反復ごとのオーバーヘッドが大きいが、ルックアップが高速であることがわかります。一方、2 つ目は、辞書を作成するという点で反復ごとのオーバーヘッドはありませんが、ルックアップは遅くなります。
どちらが良いですか?