मेरे पास एक वर्ग है, जैसे:
public class MyClass
{
public int Value { get; set; }
public bool IsValid { get; set; }
}
वास्तव में यह बहुत बड़ा है, लेकिन यह समस्या (अजीबता) को फिर से बनाता है।
मैं उस राशि को प्राप्त करना चाहता हूं Value
, जहां उदाहरण मान्य है। अब तक, मुझे इसके दो समाधान मिल गए हैं।
पहला यह है:
int result = myCollection.Where(mc => mc.IsValid).Select(mc => mc.Value).Sum();
दूसरा, हालांकि, यह है:
int result = myCollection.Select(mc => mc.IsValid ? mc.Value : 0).Sum();
मैं सबसे कुशल विधि प्राप्त करना चाहता हूं। मैंने, पहले तो सोचा था कि दूसरा कुशल होगा। फिर मेरे बारे में सैद्धांतिक भाग "ठीक है, एक ओ (एन + एम + एम) है, दूसरा एक ओ (एन + एन) है। पहले वाले को और अधिक इनवैलिड के साथ बेहतर प्रदर्शन करना चाहिए, जबकि दूसरे को बेहतर प्रदर्शन करना चाहिए।" कम के साथ"। मैंने सोचा था कि वे समान प्रदर्शन करेंगे। संपादित करें: और फिर @ मर्टिन ने बताया कि कहां और चयन संयुक्त थे, इसलिए यह वास्तव में ओ (एम + एन) होना चाहिए। हालांकि, यदि आप नीचे देखते हैं, तो ऐसा लगता है कि यह संबंधित नहीं है।
इसलिए मैंने इसे परीक्षण के लिए रखा।
(यह 100+ लाइनें है, इसलिए मुझे लगा कि इसे जिस्ट के रूप में पोस्ट करना बेहतर है।)
परिणाम दिलचस्प थे।
0% टाई टॉलरेंस के साथ:
तराजू लगभग 30 बिंदुओं द्वारा Select
और के पक्ष में हैं Where
।
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where + Select: 65
Select: 36
2% टाई सहिष्णुता के साथ:
यह वही है, सिवाय इसके कि कुछ के लिए वे 2% के भीतर थे। मैं कहता हूँ कि त्रुटि का एक न्यूनतम मार्जिन है। Select
और Where
अब सिर्फ ~ 20 पॉइंट लीड है।
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 6
Where + Select: 58
Select: 37
5% टाई सहिष्णुता के साथ:
यह वही है जो मैं कहूंगा कि मेरी त्रुटि अधिकतम मार्जिन है। यह इसे थोड़ा बेहतर बनाता है Select
, लेकिन ज्यादा नहीं।
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 17
Where + Select: 53
Select: 31
10% टाई सहिष्णुता के साथ:
यह मेरी त्रुटि के मार्जिन से बाहर है, लेकिन मैं अभी भी परिणाम में दिलचस्पी रखता हूं। क्योंकि यह Select
और देता है और Where
बीस अंक की सीसा यह कुछ समय के लिए था।
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 36
Where + Select: 44
Select: 21
25% टाई के साथ सहिष्णुता:
यह मेरी गलती के मार्जिन से बाहर निकलने का रास्ता है, लेकिन मुझे अभी भी परिणाम में दिलचस्पी है, क्योंकि अभी भी ( Select
और लगभग) अपनी 20 अंक की बढ़त बनाए हुए हैं। ऐसा लगता है जैसे यह एक अलग में इसे outclassing है, और यही इसे नेतृत्व दे रहा है।Where
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where + Select: 16
Select: 0
अब, मेरा अनुमान है कि है कि 20 अंकों की बढ़त के बीच है, जहां वे दोनों पाने के लिए बाध्य कर रहे हैं से आया है चारों ओर एक ही प्रदर्शन। मैं कोशिश कर सकता था और इसे लॉग इन कर सकता था, लेकिन इसमें जानकारी लेने के लिए पूरी जानकारी होगी। एक ग्राफ बेहतर होगा, मुझे लगता है।
तो मैंने यही किया।
यह दर्शाता है कि Select
रेखा स्थिर (अपेक्षित) रहती है और यह Select + Where
रेखा ऊपर चढ़ जाती है (अपेक्षित)। हालांकि, कारण है कि यह साथ पूरा नहीं करता है क्या पहेली मुझे है Select
वास्तव में मैं 50 से पहले उम्मीद कर रहा था, के रूप में एक अतिरिक्त प्रगणक के लिए बनाया जा सकता था: 50 पर या उससे पहले Select
और Where
। मेरा मतलब है, यह 20-पॉइंट लीड दिखाता है, लेकिन यह स्पष्ट नहीं करता है कि क्यों। यह, मुझे लगता है, मेरे प्रश्न का मुख्य बिंदु है।
ऐसा व्यवहार क्यों करता है? क्या मुझे इस पर भरोसा करना चाहिए? यदि नहीं, तो क्या मुझे दूसरे का उपयोग करना चाहिए या इस एक का?
जैसा कि @KingKong ने टिप्पणियों में उल्लेख किया है, आप लैंबडा लेने वाले Sum
अधिभार का भी उपयोग कर सकते हैं । इसलिए मेरे दो विकल्प अब इसमें बदल दिए गए हैं:
प्रथम:
int result = myCollection.Where(mc => mc.IsValid).Sum(mc => mc.Value);
दूसरा:
int result = myCollection.Sum(mc => mc.IsValid ? mc.Value : 0);
मैं इसे थोड़ा छोटा करने जा रहा हूं, लेकिन:
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
बीस-सूत्रीय लीड अभी भी है, जिसका अर्थ है कि टिप्पणियों में @Marcin द्वारा इंगित Where
और Select
संयोजन के साथ ऐसा नहीं करना है ।
पाठ की मेरी दीवार के माध्यम से पढ़ने के लिए धन्यवाद! इसके अलावा, यदि आप रुचि रखते हैं, तो यहां संशोधित संस्करण है जो एक्सेल में लगने वाले सीएसवी को लॉग करता है।
Where
+ Select
इनपुट संग्रह पर दो अलग-अलग पुनरावृत्तियों का कारण नहीं बनता है। LINQ to Objects इसे एक iteration में ऑप्टिमाइज़ करते हैं। मेरे ब्लॉग पोस्ट
mc.Value
।