2010-03-30 15 views
5

मैं फ्रेच लूप में ArrayList से आइटम हटाता हूं और follwing अपवाद प्राप्त करता हूं।संग्रह पर पुनरावृत्ति के दौरान अपवाद और उस संग्रह से आइटम हटाएं

संग्रह संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता है।

मैं कैसे, foreach में आइटम निकाल सकते हैं

संपादित करें:या दो या सभी को दूर करने के एक आइटम हो सकती है।

/* 
* Need to remove all items from 'attachementsFielPath' which does not exist in names array. 
*/ 

try 
{ 
    string attachmentFileNames = txtAttachment.Text.Trim(); // Textbox having file names. 
    string[] names = attachmentFileNames.Split(new char[] { ';' }); 

    int index = 0; 

    // attachmentsFilePath is ArrayList holding full path of fiels user selected at any time. 
    foreach (var fullFilePath in attachmentsFilePath) 
    { 
     bool isNeedToRemove = true; 

     // Extract filename from full path. 
     string fileName = fullFilePath.ToString().Substring(fullFilePath.ToString().LastIndexOf('\\') + 1); 

     for (int i = 0; i < names.Length; i++) 
     { 
     // If filename found in array then no need to check remaining items. 
     if (fileName.Equals(names[i].Trim())) 
     { 
      isNeedToRemove = false; 
      break; 
     } 
     } 

     // If file not found in names array, remove it. 
     if (isNeedToRemove) 
     { 
     attachmentsFilePath.RemoveAt(index); 
     isNeedToRemove = true; 
     } 

     index++; 
    } 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 

संपादित करें:

बाद

मेरी कोड है कोड पर आप भी कर सकते हैं सलाह। मैं छोटे तरीकों और अपवाद ArrayList

foreach (var fullFilePath in new List<string>(attachmentsFilePath)) 

{

alt text http://img641.imageshack.us/img641/1628/invalidargument1.png

से सामान्य सूची बनाने की आदि

अमान्य तर्क अपवाद हैंडलिंग में तोड़ने के लिए जब मैं List<ArrayList> का उपयोग की आवश्यकता है अपवाद तर्क '1': 'System.Collections.ArrayList' से 'int' में परिवर्तित नहीं हो सकता

attachmentsFilePath इस

ArrayList attachmentsFilePath = new ArrayList(); 

की तरह घोषित किया जाता है लेकिन जब मैं इसे इस तरह की घोषणा की, समस्या हल हो

List<ArrayList> attachmentsFilePath = new List<ArrayList>(); 

उत्तर

2

के माध्यम से आप संग्रह की एक प्रति अधिक पुनरावृति कर सकते हैं उन इंडेक्स को एक अलग संग्रह में स्टोर करें। आखिरकार आपको रिवर्स ऑर्डर में हटाए जाने वाले इंडेक्स पर लूप करना होगा और मूल संग्रह से प्रत्येक को हटा देना होगा।

list<int> itemsToDelete 

for(int i = 0; i < items.Count; i++) 
{ 
    if(shouldBeDeleted(items[i])) 
    { 
     itemsToDelete.Add(i); 
    } 
} 

foreach(int index in itemsToDelete.Reverse()) 
{ 
    items.RemoveAt(i); 
} 
+1

+1, हालांकि 'ArrayList' को उचित रूप से टाइप की गई 'सूची ' के साथ प्रतिस्थापित किया जाना चाहिए। –

+0

मैंने नई सूची (attachementsFilePath) बनाई है और यह मुझे अवैध arguemnt अपवाद देता है। मैंने प्रश्न क्षेत्र में Iamge संलग्न किया है। – Kashif

5

आप इस पर पुनरावृत्ति करते हुए एक संग्रह से कोई आइटम नहीं निकाल सकते।

आप उस आइटम की अनुक्रमणिका पा सकते हैं जिसे हटाया जाना चाहिए और पुनरावृत्ति समाप्त होने के बाद इसे हटा दें।

foreach(string fullFilePath in new List<string>(attachmentsFilePath)) 
{ 
    // check and remove from _original_ list 
} 
+2

क्यों नहीं दूर करने के लिए अनुक्रमित की एक सूची बना? –

+2

इंडेक्स की एक सूची संग्रहीत करना जोखिम भरा है। जब भी आप किसी तत्व को हटाते हैं तो आपको या तो इंडेक्स की सूची में उल्टा या ऑफसेट बनाए रखना होगा। –

+1

पुनरावृत्त करने के लिए संग्रह की एक प्रति बना रहा है अच्छा दृष्टिकोण है? – Kashif

0

को एन्यूमेरेट करते हुए (या foreach का प्रयोग करके) आप उस संग्रह को संशोधित नहीं कर सकते हैं:

int indexToRemove = 0; 

// Iteration start 

if (fileName.Equals(names[i].Trim())) 
{ 
    indexToRemove = i; 
    break; 
} 

// End of iteration 

attachmentsFilePath.RemoveAt(indexToRemove); 

अगर, हालांकि, आप, एक से अधिक आइटम को हटाने के लिए सूची की एक प्रति अधिक पुनरावृति की जरूरत है। क्या तुम सच में आइटम हटाने के लिए चाहते हैं, तो आप उन्हें और बाद में निकालें पद्धति का उपयोग करके उन्हें सूची से निकाल सकते हैं

0

निम्न कार्य करें:

foreach (var fullFilePath in new List(attachmentsFilePath)) 
{ 

इस तरह से आप मूल सूची की एक प्रतिलिपि बनाने दोहराने में

foreach(var fullFilePath in new ArrayList(attachmentsFilePath)) 
{ 
    // do stuff 
} 
+0

मैंने नई सूची (attachementsFilePath) बनाई है और यह मुझे अवैध arguemnt अपवाद देता है। मैंने प्रश्न क्षेत्र में Iamge संलग्न किया है। – Kashif

0

आप संग्रह से अधिक पाश को देखने के लिए कर सकता है जो आइटम हो एक हटाने की आवश्यकता:

6

यह ऐसा करने का एक और तरीका है, अंत से शुरू करते हैं और लोगों को आप चाहते हैं हटा दें:

List<int> numbers = new int[] { 1, 2, 3, 4, 5, 6 }.ToList(); 
for (int i = numbers.Count - 1; i >= 0; i--) 
{ 
    numbers.RemoveAt(i); 
} 
+1

+1 लूप में पीछे की सूची में पीछे हटना मेरी पसंदीदा विधि है। –

2
List<string> names = new List<string>() { "Jon", "Eric", "Me", "AnotherOne" }; 
    List<string> list = new List<string>() { "Person1", "Paerson2","Eric"}; 

    list.RemoveAll(x => !names.Any(y => y == x)); 
    list.ForEach(Console.WriteLine); 
+0

** विवरण: ** यह उदाहरण 'सूची' में से किसी भी आइटम को 'सूची'' से निकालने के लिए [LINQ] (http://stackoverflow.com/tags/linq/info) दृष्टिकोण का उपयोग करता है जो * अस्तित्व में नहीं है * नाम '([डेमो देखें] (http://ideone.com/QMkkpr))। या दूसरे शब्दों में, यह उदाहरण 'सूची' और 'नाम' के * चौराहे * को आउटपुट करता है (जो केवल 'एरिक' है)। [सूची के लिए एमएसडीएन दस्तावेज। RemoveAll] (https://msdn.microsoft.com/en-us/library/wdka673a%28v=vs.110%29.aspx)। – DavidRR

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