2014-09-26 11 views
7

हमारे पास LINQ में यह सरणी है।List.Count() और IEnumerable.Count() अलग-अलग परिणाम क्यों देता है?

string[] colors = { "green", "brown", "blue", "red" }; 

और इस कोड को वापसी 0.

var list = new List<string>(colors); 
IEnumerable<string> q3 = list.Where(c => c.Length == 3); 
list.Remove("red"); 
listBox1.Items.Add("Oh! That is : " + q3.Count()); 

और अन्य वापसी 1.

var list = new List<string>(colors); 
List<string> q3 = list.Where(c => c.Length == 3).ToList(); 
list.Remove("red"); 
listBox1.Items.Add("Oh! That is : " + q3.Count()); 

यह क्यों होता? सूची और Ienumerable के बीच अंतर क्या है?

+3

[आस्थगित निष्पादन] (http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx) शब्द आप खोज रहे हैं है। कई [में 'Enumerable' LINQ तरीकों] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods (v = vs.100) .aspx) lazily क्रियान्वित कर रहे हैं। की –

+0

संभव डुप्लिकेट [IEnumerable और सरणी, IList और सूची के बीच क्या अंतर है?] (http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list) – bit

+3

@bit: यह वास्तव में इसका डुप्लिकेट नहीं है। यह वास्तव में LINQ में स्थगित निष्पादन के बारे में है। –

उत्तर

0

IEnumerable एक इंटरफ़ेस है और एक सूची एक वर्ग है।
और IEnumerable केवल मूल्यों को संग्रहीत कर सकते हैं लेकिन आप इसे संपादित या मूल्यों को हटाने जैसे संपादित नहीं कर सकते हैं।

जब आप .ToList() करते हैं तो डेटाबेस पर क्वेरी निष्पादित की जा रही है यदि आप डीबी से आइटम चुनते हैं।

19

Where विधि आपकी क्वेरी निष्पादित नहीं करता है - यह सिर्फ एक प्रश्न है, जो तब निष्पादित किया जाता है जब डेटा अनुरोध किया जाता है बनाता है। इसे स्थगित निष्पादन के रूप में जाना जाता है। तो आपके पहले स्निपेट में, फ़िल्टर केवल तभी लागू होता है जब Count() कहा जाता है - red आइटम हटा दिया गया है।

दूसरा स्निपेट में, ToList() करने के लिए अपने कॉल बलों क्वेरी एक नई सूची बनाने के लिए तुरंत निष्पादित किया जाना है। यह तब मूल सूची से पूरी तरह से स्वतंत्र है - इसलिए मूल सूची से किसी आइटम को निकालने से परिणाम प्रभावित नहीं होते हैं।

यह q3 की घोषणा के प्रकार पर निर्भर नहीं है - महत्वपूर्ण अंतर सिर्फToList() करने के लिए कॉल है। तो यदि आप दूसरा स्निपेट बदलते हैं:

var list = new List<string>(colors); 
IEnumerable<string> q3 = list.Where(c => c.Length == 3).ToList(); 
list.Remove("red"); 
listBox1.Items.Add("Oh! That is : " + q3.Count()); 

... आप एक ही प्रभाव देखेंगे। आइटम को हटा दिए जाने से पहले क्वेरी निष्पादित की जाएगी, जिस बिंदु पर मूल सूची q3 की सामग्री के लिए अप्रासंगिक है।

इन और LINQ का बहिष्कार के बारे में अधिक जानकारी के लिए, तुम मेरे Edulinq blog series भी पढ़ सकते हैं।

संबंधित मुद्दे