Sto provando a determinare se c'è un cambiamento nell'equivalenza di Big O di un ciclo annidato quando uso una selezione 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;
}
}
}
Credo che questo esempio di loop annidato sia O (n ^ 2) per complessità.
Ho sostituito il ciclo annidato con una selezione LINQ come questa:
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 non altro, il codice sembra essere un po 'più pulito da leggere in quanto afferma esplicitamente "stiamo cercando questo particolare Bar
con cui lavorare".
La mia domanda è questa : l'uso del LINQ select riduce la complessità del Big O?