Estou tentando determinar se há uma alteração na equivalência Big O de um loop aninhado ao usar uma seleção LINQ.
public void myFunc(List<Foo> fooList, List<Bar> barList)
{
foreach(Foo foo in fooList)
{
foreach(Bar bar in barList)
{
if(foo.PropA == bar.PropA && bar.PropZ.HasValue)
foo.PropC = foo.PropB * bar.PropZ;
}
}
}
Acredito que este exemplo de loop aninhado seja O (n ^ 2) por complexidade.
Substituí o loop aninhado por um LINQ selecione assim:
public void myFunc(List<Foo> fooList, List<Bar> barList)
{
foreach(Foo foo in fooList)
{
Bar bar = (from b in barList
where foo.PropA == b.PropA
select b).FirstOrDefault();
if(bar.PropZ.HasValue)
foo.PropC = foo.PropB * bar.PropZ;
}
}
Se nada mais, o código parece ser um pouco mais limpo de ler, uma vez que afirma explicitamente "estamos procurando este particular Bar
para trabalhar".
Minha pergunta é a seguinte : O uso do LINQ select reduz a complexidade do Big O?
bar
filtrar bar.PropZ.HasValue
primeiro, se você espera que mais do que uma pequena quantia seja avaliada como falsa? Realmente não responde à sua pergunta, estou apenas revisando seu código.
foo.PropA == bar.PropA
é verdadeiro para várias entradas barList
? Edit: definitivamente não, pois o segundo lançará a NullReferenceException
quando o select retornar null
.
.FirstOrDefault()
fará com que o loop linq saia cedo se uma correspondência for encontrada, enquanto seus loops aninhados mudos não saem mais cedo, então sim, eu acho que o linq terá um melhor oh grande. Mas não tenho certeza, portanto, um comentário e não uma resposta.