2015-10-04 9 views
13

मुझे एक अजीब समस्या का सामना करना पड़ा है। यहां मैंने समस्या का पुनरुत्पादन किया।IENumerable दोहराने का कार्य

Random r = new Random(); 
List<int> x = new List<int> {1, 2, 3, 4, 5, 6}; 

var e = x.OrderBy(i => r.Next()); 
var list1 = e.ToList(); 
var list2 = e.ToList(); 

bool b = list1.SequenceEqual(list2); 
Console.WriteLine(b); // prints false 

अब तक, मैंने सोचा था कि जब लिंक कहा जाता है तो लिंक कार्य निष्पादित हो जाते हैं। लेकिन, इस विधि में ऐसा लगता है कि मैं ToList पर कॉल करता हूं, लिंक फ़ंक्शन OrderBy फिर से निष्पादित करता है। ऐसा क्यों हैं?

+5

देखें [क्वेरी निष्पादन] (https://msdn.microsoft.com/en-us/library/vstudio/bb738633 (v = vs.100) .aspx): "क्वेरी चर के दौरान LINQ क्वेरी हमेशा निष्पादित की जाती हैं क्वेरी वैरिएबल बनाया गया है, जब नहीं। इसे स्थगित निष्पादन कहा जाता है। " –

+0

@Idle_Mind आपको यह जोड़ना चाहिए कि यह * स्थगित निष्पादन के लिए प्रलेखन है। * प्रत्येक LINQ विधि पुनरावृत्ति समय पर निष्पादित नहीं होती है। –

उत्तर

19

आप स्थगित निष्पादन को देख रहे हैं। जब आप LINQ क्वेरी बनाते हैं तो यह मूल रूप से एक ब्लूप्रिंट होता है जो कहता है "जब अनुरोध किया गया है, तो डेटासोर्स में हेरफेर करने के लिए इन चरणों का पालन करें"। यहां मुश्किल हिस्सा यह है कि यह अनुरोध केवल LINQ संचालन के एक अलग सेट द्वारा किया जाता है (.ToList() इनमें से एक है)।

तो जब आप e.ToList() पर कॉल करते हैं तो यह डेटा स्रोत को यादृच्छिक बना देगा क्योंकि ब्लूप्रिंट कहता है कि ऐसा करना है। जब आप फिर उसी ब्लूप्रिंट पर .ToList() पर कॉल करते हैं, तो यह फिर से शुरू होता है और फिर से यादृच्छिक होता है।

एक ब्लूप्रिंट में कोई भी राज्य नहीं होता है, यह कहता है कि रास्ते के प्रत्येक चरण में क्या किया जाना चाहिए।

+5

सटीक होने के लिए: LINQ जहां संभव हो स्थगित निष्पादन का उपयोग करता है। 'ऑर्डरबी' या 'कहां' के लिए अनुरोध किया जाता है जब अनुरोध किया जाता है (यानी कॉल द्वारा 'toList')। दूसरों के लिए, जैसे 'गणना' या 'Sum', इसे तुरंत निष्पादित किया जाता है। –

+1

@DanielRose मूल रूप से, जहां भी संभव हो, LINQ स्थगित निष्पादन का उपयोग करेगा। उदाहरण के लिए, आप वैसे भी पूरे संग्रह को फिर से शुरू किए बिना गिन सकते हैं या योग कर सकते हैं। –

+3

@YuvalItzchakov आप पूरे संग्रह को पुन: स्थापित किए बिना गिनती या योग नहीं कर सकते; यही तुम्हारा मतलब है, है ना? – Martijn

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