2011-11-02 16 views
5

कोई बता सकता है कि सी # की निम्नलिखित पंक्ति निम्न फोएच ब्लॉक के समान क्यों नहीं है?IENumerable

string [] strs = {"asdf", "asd2", "asdf2"}; 
strs.Select(str => doSomething(str)); 


foreach(string str in strs){ 
    doSomething(str); 
} 

मैं DoSomething() के अंदर एक ब्रेकपाइंट रख दिया और यह चयन में आग नहीं करता है, लेकिन यह foreach के साथ करता है।

TIA

+2

कुछ करने के लिए की आवश्यकता होगी आप में [प्रलेखन] टिप्पणी अनुभाग के पहले कुछ शब्दों को पढ़ना चाहिए http://msdn.microsoft.com/en-us/library/ bb548891.aspx)। – ChaosPandion

+0

@ChosPandion आपकी मूल टिप्पणी बहुत बेहतर थी। ;) – Marc

+0

@Marc - मैं थोड़ी अधिक राजनयिक बनना चाहता था क्योंकि ओपी को पता नहीं था कि स्थगित या निष्पादन का मतलब क्या है। – ChaosPandion

उत्तर

1

Linq क्वेरी संसाधित नहीं किया जाएगा जब तक आप इसे एक Enumarable में बदलने का ToList(), ToArray() का उपयोग कर, आदि

और तरीका है अपने foreach बयान के बराबर है से इस तरह कुछ:

strs.ForEach(doSomething);

strs.ToList().ForEach(doSomething); 

या

Array.ForEach(strs, doSomething); 
+0

मुझे लगता है कि आपको ऐरे का मतलब है। फॉरएच (स्ट्र, डूसमिंग) – dharga

+0

@ धार, हाँ यह सही है, जब मैं परीक्षण के बिना कोड लिख रहा हूं तो मैं आमतौर पर गलतियां करता हूं, सही संस्करण या तो 'strs.ToList()। ForEach (कुछ करो); 'या' ऐरे। फॉरएच (स्ट्र्स, डूसमिंग); ' – fardjad

+0

। चयन करें() आलसी है। साथ ही, doSomething() को एक मान वापस करना होगा, जैसा कि चयन करें (ए -> बी), या .NET बोलते हैं, यह एक Func <..> लेता है, न कि कोई क्रिया <..>। – Daniel

10

इसका कारण यह है LINQ प्रश्नों को टाल रहे हैं। जब आप परिणाम तक पहुंचते हैं तो Select विधि को लैम्बडा वास्तव में निष्पादित किया जाता है।

प्रयास करें:

string [] strs = {"asdf", "asd2", "asdf2"}; 
var result = strs.Select(str => doSomething(str)); 

foreach(var item in result) { 
} 
+0

एकमात्र चीज जो मैं कहूंगा, यह है कि यदि आप अपने लूप के भीतर संग्रह को संशोधित करना चाहते हैं, तो मैं IENumerable के बजाय पुनरावृत्ति करने के लिए एक स्थिर सूची रखना पसंद करता हूं। – Gent

0

मुझे लगता है कि एक बार आप का उपयोग मूल्यों का चयन से लौटे आप DoSomething देखेंगे() कहा जाता है। यह क्यों हो रहा है यह देखने के लिए yield देखें।

1

आप (जैसे

string [] strs = {"asdf", "asd2", "asdf2"}; 
strs = strs.Select(str => doSomething(str)).ToArray(); 


foreach(string str in strs){ 
    doSomething(str); 
}