Eu tenho o seguinte código, que gostaria de acelerar:
foreach (var workflow in closedWorkflows)
{
var w = relatedWorkflows.FirstOrDefault(r => r.Fingerprint != workflow.Fingerprint && r.TradeDate == workflow.TradeDate);
if (w != null)
{
relatedWorkflows.Add(workflow);
}
}
relatedWorkflows
e closedWorkflows
são uma lista do mesmo tipo de objetos. Pensei em criar uma pesquisa ou dicionário com uma classe ou tupla anônima em Fingerprint
and TradeDate
, mas uma verificação é para igualdade e outra é para desigualdade. Seria uma boa abordagem criar pesquisas TradeDate
e, em seguida, criar pesquisas Fingerprint
para cada lista de pesquisa de TradeDate
?
Atualizada:
Um MUITO obrigado a @Dmitry Bychenko.
No meu teste a diferença é de 41486 ms vs 26ms!!!
O principal problema com o desempenho é com
digitalizamos
relatedWorkflows
repetidamente, é por isso que temosO(closedWorkflows.Count * relatedWorkflows.Count)
complexidade de tempo. Podemos nos livrar dissorelatedWorkflows.Count
com a ajuda de coleções baseadas em hash (dicionário e hashset), por exemplo