मुझे अक्सर ऐसा कुछ चाहिए:InvalidOperationException से बचने के लिए सबसे अच्छा अभ्यास: संग्रह संशोधित किया गया था?
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
lines.Remove(line)
}
}
यह काम नहीं करता है, क्योंकि मुझे हमेशा InvalidOperationException
मिलता है क्योंकि लूप के दौरान गणनाकर्ता बदल दिया गया था।
तो मैंने इस प्रकार के सभी लूप को निम्न में बदल दिया:
List<Line> remove = new List<Line>();
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
remove.Add(line)
}
}
foreach (Line line in remove) {
{
lines.Remove(line);
}
मुझे यकीन नहीं है कि यह वास्तव में सबसे अच्छा तरीका है क्योंकि सबसे खराब मामले में मुझे मूल पर 2 गुना फिर से करना है सूची और इसलिए इसे एन के बजाय समय 2n की आवश्यकता है।
क्या ऐसा करने का कोई बेहतर तरीका है?
संपादित करें:
मैं मार्क के उत्तर का उपयोग कर ऐसा करने में सक्षम था! लेकिन अगर मेरा संग्रह RemoveAll() लागू नहीं करता है तो क्या होगा?
उदाहरण के लिए
System.Windows.Controls.UIElementCollection
संपादित करें 2:
फिर मार्क की मदद से मैं अब निम्नलिखित कॉल करने में सक्षम हूं सभी ScatterViewItems को हटाएं:
CollectionUtils.RemoveAll(manager.getWindow().IconDisplay.Items, elem => elem.GetType() == typeof(ScatterViewItem));
मुझे कुछ समय पहले और कोई समाधान नहीं मिला। यह और भी बदतर है - यह 2 एन नहीं है लेकिन एन^2 'लाइनों के बाद से है। निकालें (रेखा)' संग्रह पर फिर से फिर से शुरू होता है। – Matten
लेकिन ओ (2 एन) ओ (एन) :-) वास्तव में बराबर है: जावा में आप ऐसा करने के लिए एक इटरेटर का उपयोग कर सकते हैं, या कॉपी-ऑन-लिखित संग्रह कार्यान्वयन के लिए जा सकते हैं जो पुनरावृत्ति के दौरान संशोधनों की अनुमति देता है। – Waldheinz
अद्यतन पुनः करें - मेरा संपादन देखें –