Saya mencoba untuk menentukan apakah ada perubahan dalam kesetaraan Big O dari loop bersarang ketika saya menggunakan pilih LINQ sebagai gantinya.
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;
}
}
}
Saya percaya contoh loop bersarang ini adalah O (n ^ 2) untuk kompleksitas.
Saya mengganti nested loop dengan pilihan LINQ seperti ini:
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;
}
}
Jika tidak ada yang lain, kode itu tampaknya sedikit lebih bersih untuk dibaca karena secara eksplisit menyatakan "kami sedang mencari ini Bar
untuk bekerja dengan."
Pertanyaan saya adalah ini : Apakah menggunakan pilihan LINQ mengurangi kompleksitas Big O?
bar
dan memfilter bar.PropZ.HasValue
terlebih dahulu, jika Anda mengharapkan lebih dari jumlah kecil untuk menilai false? Tidak benar-benar menjawab pertanyaan Anda, saya hanya meninjau kode Anda.
foo.PropA == bar.PropA
berlaku untuk banyak entri barList
? Sunting: pasti bukan yang kedua akan melempar NullReferenceException
ketika pilih kembali null
.
.FirstOrDefault()
akan membuat loop linq keluar lebih awal jika kecocokan ditemukan, sedangkan loop bersarang bodoh Anda tidak keluar lebih awal, jadi ya, saya akan berpikir bahwa linq akan memiliki big-oh yang lebih baik. Tapi saya tidak yakin, karena itu komentar dan bukan jawaban.