Estoy tratando de determinar si hay un cambio en la equivalencia Big O de un bucle anidado cuando uso una selección LINQ en su lugar.
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;
}
}
}
Creo que este ejemplo de bucle anidado es O (n ^ 2) por complejidad.
Reemplacé el bucle anidado con una selección LINQ como esta:
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;
}
}
Por lo menos, el código parece ser un poco más claro para leer, ya que dice explícitamente "estamos buscando este particular Bar
para trabajar".
Mi pregunta es esta : ¿el uso de LINQ select reduce la complejidad de Big O?
bar
s y filtrar bar.PropZ.HasValue
primero, si espera que más de una pequeña cantidad se evalúe como falsa? Realmente no responde a su pregunta, solo estoy revisando su código.
foo.PropA == bar.PropA
es cierto para entradas múltiples en barList
? Editar: definitivamente no, ya que el segundo arrojará un NullReferenceException
cuando regrese la selección null
.
.FirstOrDefault()
hará que el bucle linq salga temprano si se encuentra una coincidencia, mientras que sus bucles anidados tontos no salen antes, así que sí, creo que linq tendrá un mejor big-oh. Pero no estoy seguro, de ahí un comentario y no una respuesta.