कहें कि मेरे पास collection.Select(..).Where(...).Sum(...)
LINQ कार्यान्वयन - एक लूप या कई?
क्या कुछ है LINQ इंजन संग्रह पर 1 या एकाधिक लूप करेगा?
कहें कि मेरे पास collection.Select(..).Where(...).Sum(...)
LINQ कार्यान्वयन - एक लूप या कई?
क्या कुछ है LINQ इंजन संग्रह पर 1 या एकाधिक लूप करेगा?
तीन आदेशों के लिए एक एकल लूप होगा।
यदि आपको और जानकारी चाहिए तो मैं Jon Skeet's blog का पुनर्मूल्यांकन करता हूं, जहां वह LINQ से ऑब्जेक्ट्स के पुनर्मूल्यांकन का वर्णन करता है।
Sum
फिल्टर Where
, जो प्रक्षेपण Select
, जो collection
की खपत होगी के उत्पादन की खपत होगी के उत्पादन की खपत होगी। Sum
एक बार फ़िल्टर किए गए अनुक्रम को चलाएगा, जो एक बार प्रक्षेपण चलाएगा, जो एक बार collection
पर चलता है। इसलिए, संग्रह ठीक एक बार फिर से किया जाएगा।
यहाँ एक प्यारा प्रयोग है आप इस को देखने के लिए कर सकते हैं:
class Sequence : IEnumerable<int> {
public IEnumerator<int> GetEnumerator() {
for (int i = 0; i < 17; i++) {
Console.WriteLine(i);
yield return i;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
तब:
Sequence sequence = new Sequence();
int sum = sequence.Select(x => 2 * x).Where(x => x % 4 == 0).Sum();
Console.WriteLine("Sum is {0}", sum);
उत्पादन होगा:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sum is 144
दिखा रहा है कि sequence
ठीक एक बार दोहराया जाता है ।
मैं नमूना कोड के प्रयास को सलाम करता हूं। हालांकि, यह दर्शाता है कि एक अनुक्रम उदाहरण केवल एक बार समझाया गया है कि यह प्रदर्शित करने के लिए पर्याप्त नहीं है कि चयन और परिणाम का नतीजा अलग-अलग नहीं है। –
@ डेविड बी: बेशक यह नहीं है, लेकिन इसे ओपी को क्या हो रहा है इसके बारे में महसूस करना चाहिए। पूरी तरह से प्रदर्शित करने का एकमात्र तरीका यह है कि अनुक्रम केवल एक बार गणना की जाती है जिसे LINQ के कार्यान्वयन को समझना है। मैंने अपने उत्तर के शुरुआती अनुच्छेद में निर्दिष्ट किया है कि यह _should_ क्यों मामला है कि इनपुट अनुक्रम केवल एक बार फिर से चालू हो जाता है ('Sum' एक बार अपने अनुक्रम का उपभोग करता है, 'कहां' एक बार अपने अनुक्रम का उपभोग करता है, 'चयन करें' एक बार इसके अनुक्रम का उपभोग करता है और इसलिए इनपुट अनुक्रम एक बार उपभोग किया जाता है)। – jason
एक नमूना दिखाने के लिए कि चयन और कहाँ अलग प्रगणित ध्यान देने योग्य दुष्प्रभाव के लिए दोनों का चयन करें और कहाँ करने के लिए तर्क की आवश्यकता नहीं कर रहे हैं। –
यहां एक समानता है (जॉन स्कीट के कारण) जो आपको यहां क्या हो रहा है इसके बारे में महसूस कर सकता है।
मान लीजिए कि आपके पास संग्रहित व्यक्ति है जिसके पास कार्ड खेलने का एक पैक है।
"संग्रह" के बगल में "एक्स कहां एक्स फेस फेस नहीं है"।
अलावाबगल में "चुनें" "योग" है "कहाँ" "पूर्णांक के लिए कार्ड मूल्य के रूपांतरण का चयन करें" है
।
आप योग को दबाते हैं। योग एक पाश में चला जाता है।
Sum pokes का चयन करें। एक लूप में चयन करें।
चयन करने के लिए कुछ भी नहीं है, तो चुटकुले का चयन करें। एक लूप में कहाँ जाता है।
जहां संग्रह संग्रह करता है। संग्रह हाथ जहां हुकुम के राजा।
जहां इसे फर्श पर फेंकता है और संग्रह फिर से संग्रह करता है। संग्रह हाथ जहां हीरे की रानी, जहां फर्श पर फेंकता है। जहां संग्रह फिर से संग्रह और इस बार संग्रह हाथ जहां तीनों दिल।
जहां तीनों दिल का चयन करने के लिए हाथ हैं। योग को संख्या तीन और हाथों को निकालने का चयन करें। योग जोड़ता है कि शून्य पर और फिर लूप के शीर्ष पर वापस चला जाता है, और पोक फिर से चुनें।
लूप को फिर से शुरू करें, जहां पोकिंग का चयन करें चुनें। जहां लूप को फिर से शुरू किया जाता है, कलेक्शन संग्रह तब तक बार-बार संग्रहित करता है जब कहां स्वीकार करता है।
और इसलिए यह करने के लिए संग्रह सौंपने कार्ड के साथ, चला जाता है कहाँ, कहाँ या तो योग है, जो एक चल कुल रहता है के लिए उन्हें दूर फेंक या उन पर गुजर का चयन करने के लिए, और चयन खिला संख्या।
जब संग्रह अंत में कहते हैं, "कोई और अधिक करने के लिए" कहाँ, कहाँ कहते हैं, "कोई और अधिक" का चयन करें करने के लिए, का चयन करें कहते हैं, "कोई और अधिक" योग करने के लिए, और बीमा राशि आप के लिए योग देता है।
बहुत अच्छा सादृश्य (जॉन, उसे साझा करने के लिए धन्यवाद एरिक), लेकिन 'Select' और के आदेश' ओ पी के उदाहरण से उलट कर रहे हैं Where'। उस ने कहा, बिंदु स्पष्ट है। – jason
वहाँ और अधिक जटिल प्रश्नों रहे हैं, जब वहाँ अधिक छोरों हो जाएगा? –
आप कुछ बना सकते हैं। ऐसे आदेश हैं जिन्हें उदाहरण के लिए ऑर्डरबी() जैसे पूर्ण संग्रह के माध्यम से चलने की आवश्यकता है। – StampedeXV
@ मैरी, हां, कुछ ऑपरेटरों को ग्रुपबी जैसी जारी रखने से पहले सभी वस्तुओं को देखने की आवश्यकता होती है। यदि आप एकाधिक समूहबी को गठबंधन करना चाहते हैं तो डेटा के माध्यम से कई इंटरैक्शन होते हैं (हालांकि अगली पुनरावृत्ति प्रत्येक व्यक्तिगत प्रविष्टि के बजाय समूहों पर होगी)। यदि कोई सबक्वायरी है, तो सूची के समान उच्च ओवरहेड भी होगा। कहीं भी (x => list.count (x)> 2); Subquery प्रत्येक सूची आइटम के लिए एक अलग पाश का कारण बन जाएगा। –