আমার কাছে সংগ্রহ থেকে কোনও আইটেম লুপে গণনার সময় সরিয়ে ফেলার চেষ্টা করার ক্লাসিক কেস রয়েছে:
List<int> myIntCollection = new List<int>();
myIntCollection.Add(42);
myIntCollection.Add(12);
myIntCollection.Add(96);
myIntCollection.Add(25);
foreach (int i in myIntCollection)
{
if (i == 42)
myIntCollection.Remove(96); // The error is here.
if (i == 25)
myIntCollection.Remove(42); // The error is here.
}
পরিবর্তন হওয়ার পরে পুনরাবৃত্তির শুরুতে একটি InvalidOperationException
নিক্ষেপ করা হয়, কারণ অন্তর্নিহিত সংগ্রহ পরিবর্তনের সময় গণকগণ পছন্দ করেন না।
পুনরাবৃত্তি করার সময় আমাকে সংগ্রহে পরিবর্তন করতে হবে। এটি এড়ানোর জন্য অনেকগুলি নিদর্শন ব্যবহার করা যেতে পারে তবে এগুলির কোনওটিরই ভাল সমাধান বলে মনে হয় না:
এই লুপটির ভিতরে মুছবেন না, পরিবর্তে একটি পৃথক "মুছুন তালিকা" রাখুন, যা আপনি প্রধান লুপের পরে প্রক্রিয়া করেন।
এটি সাধারণত একটি ভাল সমাধান, তবে আমার ক্ষেত্রে, আইটেমটি সত্যই আইটেমটি মোছার জন্য লুপের পরে অবধি ততক্ষণে "অপেক্ষা" হিসাবে চলে যেতে হবে যা আমার কোডের লজিক প্রবাহকে পরিবর্তন করে।
আইটেমটি মোছার পরিবর্তে কেবল আইটেমটিতে একটি পতাকা সেট করুন এবং এটি নিষ্ক্রিয় হিসাবে চিহ্নিত করুন। তারপরে তালিকাটি পরিষ্কার করতে প্যাটার্ন 1 এর কার্যকারিতা যুক্ত করুন।
এটি আমার সমস্ত প্রয়োজনের জন্য কাজ করবে , তবে এর অর্থ হ'ল প্রতি বার যখন কোনও আইটেম অ্যাক্সেস করা হয় তখন নিষ্ক্রিয় পতাকাটি পরীক্ষা করতে প্রচুর কোড পরিবর্তন করতে হবে। এটি আমার পছন্দ অনুসারে অনেক বেশি প্রশাসন।
একরকম যে থেকে আহরিত কোন ক্লাসে প্যাটার্ন 2 ধারনা নিগমবদ্ধ
List<T>
। এই সুপারলিস্টটি নিষ্ক্রিয় পতাকা, সত্যের পরে অবজেক্টগুলির মোছা এবং গণনার গ্রাহকদের নিষ্ক্রিয় হিসাবে চিহ্নিত আইটেমগুলি প্রকাশ করবে না। মূলত, এটি কেবল প্যাটার্ন 2 (এবং পরবর্তীকালে প্যাটার্ন 1) এর সমস্ত ধারণাকে আবদ্ধ করে।এই মত একটি বর্গ কি বিদ্যমান? কারও কি এর জন্য কোড আছে? নাকি এর চেয়ে ভাল উপায় আছে?
আমাকে বলা হয়েছে যে
myIntCollection.ToArray()
পরিবর্তে অ্যাক্সেস করাmyIntCollection
সমস্যার সমাধান করবে এবং আমাকে লুপের ভিতরে মুছতে দেবে।এটি আমার কাছে খারাপ ডিজাইনের প্যাটার্নের মতো বলে মনে হচ্ছে, না ঠিক আছে?
বিশদ:
তালিকায় অনেকগুলি আইটেম থাকবে এবং আমি কেবল সেগুলি থেকে কিছু সরিয়ে ফেলব।
লুপের অভ্যন্তরে আমি সমস্ত ধরণের প্রক্রিয়া করব, যোগ করা, অপসারণ ইত্যাদি করব, সুতরাং সমাধানটি মোটামুটি জেনেরিক হওয়া দরকার।
আমার যে আইটেমটি মুছতে হবে তা লুপের বর্তমান আইটেম নাও হতে পারে। উদাহরণস্বরূপ, আমি একটি 30 আইটেম লুপের আইটেম 10 এ থাকতে পারি এবং আইটেম 6 বা 26 আইটেমটি সরিয়ে ফেলতে হবে the অ্যারের মাধ্যমে পিছনে হাঁটা আর এর কারণে আর কাজ করবে না। ; ও (