मैं एक LINQ प्रश्न हैं की कोशिश कर मदद, परिणाम जिनमें से मैं एक foreach पाश में पुनरावृति।foreach और LINQ क्वेरी - जरूरत कृपया समझने की
पहले एक प्रश्न जो एक मेज लेआउट पैनल से नियंत्रण का एक संग्रह पकड़ लेता है, मैं तो संग्रह से अधिक पुनरावृति और इस तरह TableLayoutPanel से नियंत्रण हटाने के लिए:
var AllItems = (from Item in this.tableLayoutPanel1.Controls.OfType<ItemControl>()
select Item);
foreach (ItemControl item in AllItems)
{
Trace.WriteLine("Removing " + item.ToString());
this.tableLayoutPanel1.Controls.Remove(item);
item.Dispose();
}
ऊपर मैं के रूप में काम नहीं करता अपेक्षित (यानी एक त्रुटि फेंक दें), यह केवल आधे नियंत्रण (ओडीडी क्रमांकित वाले) को हटा देता है ऐसा प्रतीत होता है कि प्रत्येक पुनरावृत्ति पर ऑलइटम अपने स्वयं को कम कर देता है, और हालांकि अंतर्निहित संग्रह को संशोधित किया जा रहा है, कोई त्रुटि नहीं फेंक दी गई है।
अगर मैं तार की एक सरणी के साथ समान है:
string[] strs = { "d", "c", "A", "b" };
List<string> stringList = strs.ToList();
var allitems = from letter in stringList
select letter;
foreach (string let in allitems)
{
stringList.Remove(let);
}
इस बार दृश्य स्टूडियो (उम्मीद के रूप में) में शिकायत कि अंतर्निहित संग्रह बदल गया है एक त्रुटि फेंकता है।
क्यों पहला उदाहरण भी उड़ा नहीं करता है?
वहाँ Iterators/IEnumerable के बारे में कुछ है कि मैं यहाँ समझ नहीं कर रहा हूँ और मुझे आश्चर्य है अगर किसी ने मुझे समझने की क्या LINQ और foreach के साथ हुड के नीचे चल रहा है मदद कर सकता है।
(मुझे पता है कि मैं AllItems.ToList() द्वारा दोनों मुद्दों इलाज कर सकते हैं हूँ, इससे पहले कि मैं पुनरावृति, लेकिन समझने के लिए क्यों दूसरे उदाहरण एक त्रुटि फेंकता चाहते हैं और पहली नहीं है)
तथ्य से संबंधित नहीं इस समस्या के लिए कारण यह है कि 'Enumerable.OfType' आस्थगित निष्पादन का उपयोग करके लागू किया गया है है, इसलिए अनुक्रम हमेशा हर गणन पर परिवर्तन? –
@TimSchmelter Well, 'OfType' केवल स्रोत गणनाकर्ता का उपयोग करके गणना करता है - जबकि यह जांच नहीं कर रहा है, वही बात तब होगी जब आप ऑब्जेक्ट्स की गणना करते हैं, और लूप के अंदर चेक डालते हैं। अंतर्निहित गणनाकर्ता यह जांच नहीं कर रहा है कि नियंत्रण संग्रह संशोधित है या नहीं। –
@TimSchmelter: मुझे संदेह है कि सभी LINQ संचालन मूल पोस्ट कोड से हटा दिए जा सकते हैं, और यह वैसे ही व्यवहार करेगा। जैसा कि रीड कहते हैं, यह गणनाकर्ता कार्यान्वयन का परिणाम है। ऑफ टाइप के पास इसके साथ कुछ लेना देना नहीं है। – StriplingWarrior