代わりにLINQ選択を使用すると、ネストされたループのBig O等価に変更があるかどうかを確認しようとしています。
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;
}
}
}
このネストされたループの例は、複雑さのためにO(n ^ 2)であると思います。
ネストされたループを次のようなLINQ選択に置き換えました。
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;
}
}
他に何もない場合、コードは、「これを処理するために特定のものBar
を探している」と明示的に述べているため、少し読みやすくなっています。
私の質問はこれです:LINQ selectを使用するとBig Oの複雑さが軽減されますか?
bar
s をループしてbar.PropZ.HasValue
最初にフィルタリングする時間を節約できますか?本当にあなたの質問に答えません、私はあなたのコードをレビューしています。
foo.PropA == bar.PropA
をしていますbarList
か?編集:間違いなく、2番目NullReferenceException
はselectが返されたときにをスローするためnull
です。
.FirstOrDefault()
あなたのダムネストされたループが早期に終了していない一方で、一致するものが見つかった場合は、早期LINQループ出口を行いますので、はい、私は、LINQは、より良いビッグああを持っているだろうと思います。しかし、定かではないので、コメントではなく回答です。