Ich versuche festzustellen, ob sich die Big O-Äquivalenz einer verschachtelten Schleife ändert, wenn ich stattdessen eine LINQ-Auswahl verwende.
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;
}
}
}
Ich glaube, dieses Beispiel für eine verschachtelte Schleife ist aus Gründen der Komplexität O (n ^ 2).
Ich habe die verschachtelte Schleife durch eine LINQ-Auswahl wie folgt ersetzt:
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;
}
}
Wenn nichts anderes, scheint der Code ein wenig sauberer zu sein, da er ausdrücklich besagt: "Wir suchen nach diesem speziellen Code, mit dem wir Bararbeiten können."
Meine Frage lautet : Reduziert die Verwendung der LINQ-Auswahl die Big O-Komplexität?
bars zu durchlaufen und zuerst zu filtern bar.PropZ.HasValue, wenn Sie erwarten, dass mehr als eine winzige Menge als falsch ausgewertet wird? Beantwortet Ihre Frage nicht wirklich, ich überprüfe nur Ihren Code.
foo.PropA == bar.PropAfür mehrere Einträge in gilt barList? Bearbeiten: definitiv nicht, da der zweite ein wirft, NullReferenceExceptionwenn die Auswahl zurückkehrt null.
.FirstOrDefault()dass die Linq-Schleife vorzeitig beendet wird, wenn eine Übereinstimmung gefunden wird, während Ihre dummen verschachtelten Schleifen nicht vorzeitig beendet werden. Ja, ich würde denken, dass Linq ein besseres Big-Oh hat. Aber ich bin mir nicht sicher, daher ein Kommentar und keine Antwort.