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 Baruntuk bekerja dengan."
Pertanyaan saya adalah ini : Apakah menggunakan pilihan LINQ mengurangi kompleksitas Big O?
bardan memfilter bar.PropZ.HasValueterlebih 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.PropAberlaku untuk banyak entri barList? Sunting: pasti bukan yang kedua akan melempar NullReferenceExceptionketika 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.