निम्नलिखित LINQ स्टेटमेंट कैसे काम करता है ?
यहाँ मेरा कोड है:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
आउटपुट: 2, 4, 6, 8
क्यों नहीं 2, 4, 6?
निम्नलिखित LINQ स्टेटमेंट कैसे काम करता है ?
यहाँ मेरा कोड है:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
आउटपुट: 2, 4, 6, 8
क्यों नहीं 2, 4, 6?
जवाबों:
उत्पादन होता है 2,4,6,8की वजह से स्थगित कर निष्पादन ।
क्वेरी वेरिएबल को वास्तव में निष्पादित किया जाता है, जब क्वेरी वैरिएबल से अधिक पुनरावृति होती है, न कि जब क्वेरी वैरिएबल बनाया जाता है। इसे आस्थगित निष्पादन कहा जाता है।
- सुप्रोटिम अग्रवाल, " लाइनक्यू में स्थगित बनाम तत्काल क्वेरी"
एक और निष्पादन है जिसे तत्काल क्वेरी निष्पादन कहा जाता है , जो क्वेरी परिणामों को कैशिंग करने के लिए उपयोगी है। सुप्रोटीम अग्रवाल से फिर:
एक क्वेरी के तत्काल निष्पादन के लिए मजबूर करने के लिए जो एक सिंगलटन मान का उत्पादन नहीं करता है, आप क्वेरी या क्वेरी चर पर
ToList(), ToDictionary(), ToArray(), Count(), Average()याMax()विधि को कॉल कर सकते हैं । इन्हें रूपांतरण ऑपरेटर कहा जाता है जो आपको परिणाम की एक कॉपी / स्नैपशॉट बनाने की अनुमति देते हैं और क्वेरी को फिर से निष्पादित करने की आवश्यकता के बिना, जितनी बार चाहें उतनी बार पहुंच सकते हैं।
यदि आप चाहते हैं कि आउटपुट हो 2,4,6, तो उपयोग करें .ToList():
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
.First(), .FirstOrDefault(), .Single()और .SingleOrDefault()भी क्वेरी के मूल्यांकन ट्रिगर।
यह आस्थगित निष्पादन के कारण हुआ है, जिसका अर्थ है कि अभिव्यक्ति की गणना को तब तक निष्पादित नहीं किया जाता है जब तक कि उसे किसी जगह की आवश्यकता न हो। यदि डेटा बहुत बड़ा है तो यह प्रदर्शन को बेहतर बनाता है।
इसका कारण आपके लैम्ब्डा अभिव्यक्ति का आस्थगित निष्पादन है। जब आप फ़ॉरेस्ट लूप में चलना शुरू करते हैं, तो क्वेरी निष्पादित हो जाती है।
आप इस परिणाम को आस्थगित निष्पादन के कारण प्राप्त कर रहे हैं जिसका अर्थ है कि परिणाम का मूल्यांकन तब तक नहीं किया जाता है जब तक कि यह पहली बार पहुंच न जाए।
इसे और अधिक स्पष्ट करने के लिए बस अपने स्निपेट के अंत में सूची में 10 जोड़ें और फिर प्रिंट करें आपको आउटपुट में 10 नहीं मिलेगा
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).Tolist();
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
//new*
list.Add(10);
foreach (var i in even)
{
Console.WriteLine(i);
}
10आउटपुट में मिलता हूं ।
8या तो आउटपुट नहीं होगा ।