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 Bar
arbeiten können."
Meine Frage lautet : Reduziert die Verwendung der LINQ-Auswahl die Big O-Komplexität?
bar
s 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.PropA
für mehrere Einträge in gilt barList
? Bearbeiten: definitiv nicht, da der zweite ein wirft, NullReferenceException
wenn 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.