次foreach p : allPersons
の例では、マップ/辞書をキャッシング/メモ化に使用できることは明らかです (ロジックがシーケンシャルであるため)。
Dictionary<string, int> personNameToIdMap = new Dictionary<string, int>();
foreach(p : allPersons)
{
int outputId;
if(personNameToIdMap.TryGetValue(p.Name, out outputId))
{
// nothing to do since map contained the p.Name
}
else
{
outputId = doExpensiveLookup(p.Name);
personNameToIdMap[p.Name] = outputId;
}
...
p.Id = outputId;
}
上記foreach
をに置き換えるとParallel.ForEach
、各スレッドは を共有しpersonNameToIdMap
ますか?