खोज…


तत्काल निष्पादन बनाम स्थगित निष्पादन

कुछ LINQ पद्धतियाँ एक क्वेरी ऑब्जेक्ट लौटाती हैं। यह ऑब्जेक्ट क्वेरी के परिणामों को नहीं रखता है; इसके बजाय, उन परिणामों को उत्पन्न करने के लिए आवश्यक सभी जानकारी है:

var list = new List<int>() {1, 2, 3, 4, 5};
var query = list.Select(x => {
    Console.Write($"{x} ");
    return x;
});

क्वेरी में Console.Write लिए एक कॉल है। इसके बावजूद, लेकिन Console.Write लिए कुछ भी आउटपुट नहीं किया गया है। ऐसा इसलिए है क्योंकि क्वेरी को अभी तक निष्पादित नहीं किया गया है, और इस प्रकार Select किए गए फ़ंक्शन का मूल्यांकन कभी नहीं किया गया है। इसे आस्थगित निष्पादन के रूप में जाना जाता है - क्वेरी के निष्पादन में कुछ समय बाद तक देरी होती है।

अन्य LINQ विधियाँ क्वेरी के तत्काल निष्पादन को बाध्य करती हैं; ये विधियाँ क्वेरी को निष्पादित करती हैं और इसके मान उत्पन्न करती हैं:

var newList = query.ToList();

इस बिंदु पर, Select में पारित फ़ंक्शन का मूल सूची में प्रत्येक मान के लिए मूल्यांकन किया जाएगा, और निम्नलिखित कंसोल पर आउटपुट होगा:

1 2 3 4 5


आम तौर पर, LINQ विधियाँ जो एकल मान (जैसे Max या Count ) ToList , या जो एक ऐसी वस्तु ToList जो वास्तव में मान रखती हैं (जैसे कि ToList या ToDictionary ) तुरंत क्रियान्वित करती हैं।

वे विधियाँ जो एक IEnumerable<T> या IQueryable<T> हैं, क्वेरी ऑब्जेक्ट लौटा रही हैं, और बाद के बिंदु तक निष्पादन को समाप्त करने की अनुमति देती हैं।

एक विशेष LINQ विधि क्वेरी को तुरंत निष्पादित करने के लिए बाध्य करती है या नहीं, MSDN - C # , या VB.NET में पाया जा सकता है।

स्ट्रीमिंग मोड (आलसी मूल्यांकन) बनाम गैर-स्ट्रीमिंग मोड (उत्सुक मूल्यांकन)

LINQ मेथड में से जो डिफरेंशियल एक्जाम का उपयोग करता है, कुछ को एक बार में मूल्यांकन करने के लिए एक एकल मान की आवश्यकता होती है। निम्नलिखित कोड:

var lst = new List<int>() {3, 5, 1, 2};
var streamingQuery = lst.Select(x => {
    Console.WriteLine(x);
    return x;
});
foreach (var i in streamingQuery) {
    Console.WriteLine($"foreach iteration value: {i}");
}

उत्पादन होगा:

3
फारसी पुनरावृत्ति मूल्य: 3
5
फारसी पुनरावृत्ति मूल्य: 5
1
फारसी पुनरावृत्ति मूल्य: 1
2
फारसी पुनरावृत्ति मूल्य: 2

के लिए पारित समारोह क्योंकि Select के प्रत्येक यात्रा पर मूल्यांकन किया जाता है foreach । इसे स्ट्रीमिंग मोड या आलसी मूल्यांकन के रूप में जाना जाता है।


अन्य LINQ विधियाँ - ऑपरेटरों को छांटना और समूहित करना - मूल्यांकन किए जाने से पहले सभी मूल्यों की आवश्यकता होती है, इससे पहले कि वे कोई मूल्य वापस कर सकें:

var nonStreamingQuery = lst.OrderBy(x => {
    Console.WriteLine(x);
    return x;
});
foreach (var i in nonStreamingQuery) {
    Console.WriteLine($"foreach iteration value: {i}");
}

उत्पादन होगा:

3
5
1
2
फारसी पुनरावृत्ति मूल्य: 1
फारसी पुनरावृत्ति मूल्य: 2
फारसी पुनरावृत्ति मूल्य: 3
फारसी पुनरावृत्ति मूल्य: 5

इस मामले में, क्योंकि आरोही क्रम में foreach लिए मान उत्पन्न किए जाने चाहिए, सभी तत्वों को पहले मूल्यांकन किया जाना चाहिए, ताकि यह निर्धारित किया जा सके कि कौन सा सबसे छोटा है, और कौन सा सबसे छोटा है, और इसी तरह। इसे गैर-स्ट्रीमिंग मोड या उत्सुक मूल्यांकन के रूप में जाना जाता है।


क्या कोई विशेष LINQ विधि स्ट्रीमिंग या नॉन-स्ट्रीमिंग मोड का उपयोग करती है, MSDN - C # , या VB.NET में पाया जा सकता है।

आस्थगित निष्पादन के लाभ - प्रश्न निर्माण

मानों का मूल्यांकन करने से पहले, अलग-अलग निष्पादन, अंतिम क्वेरी को बनाने के लिए विभिन्न ऑपरेशनों को संयोजित करने में सक्षम बनाता है:

var list = new List<int>() {1,1,2,3,5,8};
var query = list.Select(x => x + 1);

यदि हम इस बिंदु पर क्वेरी निष्पादित करते हैं:

foreach (var x in query) {
    Console.Write($"{x} ");
}

हमें निम्न आउटपुट मिलेगा:

२ २ ३ ४ ६ ९

लेकिन हम अधिक ऑपरेटरों को जोड़कर क्वेरी को संशोधित कर सकते हैं:

Console.WriteLine();
query = query.Where(x => x % 2 == 0);
query = query.Select(x => x * 10);

foreach (var x in query) {
    Console.Write($"{x} ");
}

आउटपुट:

२० २० ४० ६०

आस्थगित निष्पादन के लाभ - वर्तमान डेटा को क्वेरी करना

आस्थगित निष्पादन के साथ, यदि डेटा को क्वेरी किया जाना है, तो क्वेरी ऑब्जेक्ट निष्पादन के समय डेटा का उपयोग करता है, परिभाषा के समय पर नहीं।

var data = new List<int>() {2, 4, 6, 8};
var query = data.Select(x => x * x);

यदि हम इस बिंदु पर क्वेरी को तत्काल विधि या foreach साथ निष्पादित करते हैं, तो क्वेरी सम संख्याओं की सूची पर काम करेगी।

हालाँकि, यदि हम सूची में मान बदलते हैं:

data.Clear();
data.AddRange(new [] {1, 3, 5, 7, 9});

या भले ही हम data को आ नई सूची प्रदान data :

data = new List<int>() {1, 3, 5, 7, 9};

और फिर क्वेरी निष्पादित करें, क्वेरी data के नए मूल्य पर काम करेगी:

foreach (var x in query) {
    Console.Write($"{x} ");
}

और निम्नलिखित उत्पादन करेंगे:

१ ९ २५ ४ ९ 81१



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow