Bunun gibi bir dersim var:
public class MyClass
{
public int Value { get; set; }
public bool IsValid { get; set; }
}
Aslında çok daha büyüktür, ancak bu sorunu yeniden yaratır (tuhaflık).
Value
Örneğin geçerli olduğu toplamını almak istiyorum . Şimdiye kadar buna iki çözüm buldum.
İlki şu:
int result = myCollection.Where(mc => mc.IsValid).Select(mc => mc.Value).Sum();
İkincisi ise şudur:
int result = myCollection.Select(mc => mc.IsValid ? mc.Value : 0).Sum();
En verimli yöntemi elde etmek istiyorum. İlk başta ikincisinin daha verimli olacağını düşündüm. Sonra teorik kısmım "Peki, biri O (n + m + m), diğeri O (n + n). Birincisi daha fazla sakatla daha iyi performans göstermeli, ikincisi daha iyi performans göstermeli daha az ". Eşit performans göstereceklerini düşündüm. DÜZENLEME: Ve sonra @Martin, Where ve Select'in birleştirildiğine işaret etti, bu yüzden aslında O (m + n) olması gerektiğini söyledi. Ancak, aşağıya bakarsanız, bunun alakası yok gibi görünüyor.
Ben de teste tabi tuttum.
(100'den fazla satır, bu yüzden bir
Özet olarak göndermenin daha iyi olacağını düşündüm.) Sonuçlar ... ilginçti.
% 0 bağ toleransı ile:
Ölçekler yanayız Select
ve Where
~ 30 noktaları hakkında tarafından.
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where + Select: 65
Select: 36
% 2 bağ toleransı ile:
Aynı şey, bazıları için% 2 içindeydi. Bunun minimum hata payı olduğunu söyleyebilirim. Select
ve Where
şimdi sadece ~ 20 puan önde.
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 6
Where + Select: 58
Select: 37
% 5 bağ toleransı ile:
Bu benim maksimum hata payım olduğunu söyleyebilirim. Bunu biraz daha iyi yapar Select
, ama çok değil.
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 17
Where + Select: 53
Select: 31
% 10 bağ toleransı ile:
Bu, hata payımın dışında, ama yine de sonuçla ilgileniyorum. O verir çünkü Select
ve Where
yirmi nokta kurşun şimdi bir süre yaşadı.
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 36
Where + Select: 44
Select: 21
% 25 bağ toleransı ile:
Bu şekilde, bir yolu hata benim marjı dışında, ama çünkü ben hala sonuç ilgilenen kulüpler Select
ve Where
hala (neredeyse) onların 20 puan önde tutun. Görünüşe göre onu birkaç tanede geride bırakıyor ve ona liderlik eden de bu.
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where + Select: 16
Select: 0
Şimdi, 20 farkla öndeler ikisi de almak için bağlı konum ortada, geldiğini tahmin ediyorum etrafında aynı performansı. Bunu deneyebilir ve kaydedebilirdim, ama almak için çok fazla bilgi olurdu. Bir grafik daha iyi olurdu, sanırım.
Ben de öyle yaptım.
Bu gösteriyor ki Select
hat istikrarlı tutar (beklenen) ve bu Select + Where
hat yukarı tırmanır (beklenen). Onunla uymayan neden Ancak, ne Kafamı kurcalayan olan Select
ekstra listeleyicisi için oluşturulan gerekiyordu olarak, aslında 50'den önceki bekliyordum: 50 veya daha erken Select
ve Where
. Demek istediğim, bu 20 puanlık farkı gösteriyor ama nedenini açıklamıyor. Sanırım sorumun ana noktası bu.
Neden böyle davranıyor? Güvenmeli miyim? Değilse, diğerini mi yoksa bunu mu kullanmalıyım?
@KingKong'un yorumlarda bahsettiği gibi, Sum
lambda alan aşırı yüklemeyi de kullanabilirsiniz . Yani iki seçeneğim şimdi şu şekilde değiştirildi:
İlk:
int result = myCollection.Where(mc => mc.IsValid).Sum(mc => mc.Value);
İkinci:
int result = myCollection.Sum(mc => mc.IsValid ? mc.Value : 0);
Biraz kısaltacağım ama:
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where: 60
Sum: 41
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 8
Where: 55
Sum: 38
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 21
Where: 49
Sum: 31
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 39
Where: 41
Sum: 21
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where: 16
Sum: 0
Yirmi puanlık liderlik hala oradadır, yani yorumlarda @ Marcin tarafından belirtilen Where
ve Select
kombinasyonuyla bir ilgisi yoktur .
Metin duvarımı okuduğunuz için teşekkürler! Ayrıca, ilgileniyorsanız, Excel'in aldığı CSV'yi günlüğe kaydeden değiştirilmiş sürümü burada bulabilirsiniz .
mc.Value
.