সবার আগে: পরিভাষা। আপনি যদি "আবর্জনা তালিকা" বলে থাকেন, লোকেরা ভাববে আপনি আবর্জনা সংগ্রহকারী সম্পর্কে কথা বলছেন। একে "মৃত তালিকা" বলি।
আপনি সম্ভবত আবিষ্কার করেছেন যেহেতু আপনার প্রশ্ন হিসাবে আপনি কোনও সংগ্রহের মাধ্যমে পুনরাবৃত্তি করার সময় কোনও সংগ্রহ থেকে আইটেমগুলি সরাতে পারবেন না। যদি আপনার সংগ্রহটি হয় List<>
তবে এটি থেকে আইটেমগুলি সরিয়ে ফেলার সহজ উপায় হ'ল:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
আপনি পিছনে পুনরাবৃত্তি নোট করুন । আপনি পূর্বে পুনরাবৃত্তি করার সময় আইটেমগুলি সরিয়ে ফেলতে পারেন, তবে এটি মেসরিয়র এবং এর প্রয়োজন একটি goto
। আপনি এটি দিয়ে করতে পারবেন না foreach
।
আপনি হয় আপনার আপডেট লুপ থেকে আলাদা করে অপসারণ করতে পারেন। অথবা আপনি এটিকে আপনার আপডেট লুপের সাথে একীভূত করতে পারেন। RemoveAt
লুপের শেষে সর্বদা করুন - লুপের সেই বিন্দুটির পরে, list[i]
বৈধ হিসাবে বিবেচনা করা যায় না (এটি পরবর্তী পুনরাবৃত্তিতে আবার বৈধ হয়ে যায়)।
নোট, এছাড়াও, প্রতিটি বস্তুর নিজস্ব IsDead
পতাকা রয়েছে (যদি আপনি নিষ্পত্তির প্যাটার্নটি ব্যবহার করেন তবে আপনি এটি তৈরি করতে পারেন IsDisposed
) - আপনাকে আসলে "মৃত তালিকা" বজায় রাখার দরকার নেই।
প্রতিটি আইটেমের পতাকা ব্যবহার করা পারফরম্যান্সের পক্ষে বাঞ্ছনীয়, কারণ অপসারণের জন্য আপনাকে তালিকার মাধ্যমে অনুসন্ধান করা এড়াতে হবে। এবং এটি ডিজাইনের পক্ষেও পছন্দনীয় - এর অর্থ হ'ল প্রতিটি বস্তু সহজেই মারা গেছে কিনা তা পরীক্ষা করতে পারে - সুতরাং আপনি দুর্ঘটনাক্রমে কোনও পদ্ধতিতে কল করবেন না (যদি এই বিষয়গুলি নিষ্পত্তিযোগ্য প্যাটার্নটি প্রয়োগ করে থাকে তবে তারা ObjectDisposedException
এই ক্ষেত্রে ফেলে দিতে পারে )।
আপনার যদি একটি ব্যতীত অন্য কোনও সংগ্রহ থাকে List<>
, তবে সেই সংগ্রহ থেকে মৃত আইটেমগুলি সরিয়ে ফেলতে এখনও একটি মৃত তালিকা তৈরি করা জড়িত থাকতে পারে (কারণ পুনরাবৃত্তির সময় অপসারণ সম্ভব নয়)। আমার মতে, নিখুঁত, নকশা-বুদ্ধিমান, মৃত তালিকাটি ব্যবহারের ঠিক আগে তৈরি করা, সংগ্রহগুলি পুনরুদ্ধার করে ফ্ল্যাশগুলির সন্ধানের IsDead
পরিবর্তে বস্তুগুলিকে হত্যা করার কারণে তালিকাটি বজায় রাখার চেষ্টা না করে।
একবার আপনি একটি মৃত তালিকার সাথে সমাপ্ত হয়ে গেলে, আপনার Clear()
এটি করা উচিত এবং পরে এটিকে পুনরায় ব্যবহারের জন্য এটিকে প্রায় রাখুন।