কাউন্টার ভেরিয়েবল ব্যবহার করে কোনও ভুল নেই। আসলে, আপনি ব্যবহার করেন না for
, foreach
while
বা do
, একটি পাল্টা ভেরিয়েবল অবশ্যই কোথাও ঘোষিত এবং বর্ধিত হতে হবে।
সুতরাং আপনার যদি উপযুক্ত-সূচকযুক্ত সংগ্রহ আছে কিনা তা নিশ্চিত না হন তবে এই প্রতিমাটি ব্যবহার করুন:
var i = 0;
foreach (var e in collection) {
// Do stuff with 'e' and 'i'
i++;
}
অন্যথায় এটি ব্যবহার করুন যদি আপনি জানেন যে সূচক অ্যাক্সেসের জন্য আপনার সূচকযোগ্য সংগ্রহটি ও (1) (যা এটির জন্য Array
এবং সম্ভবত List<T>
(ডকুমেন্টেশনটি বলে না)) তবে অন্য ধরণের (যেমন LinkedList
) প্রয়োজন হয় না:
// Hope the JIT compiler optimises read of the 'Count' property!
for (var i = 0; i < collection.Count; i++) {
var e = collection[i];
// Do stuff with 'e' and 'i'
}
'ম্যানুয়ালি' চালানো এবং জিজ্ঞাসাবাদ করার IEnumerator
মাধ্যমে কখনও এটি পরিচালনা করা উচিত নয় - আপনাকে সেই বিশেষ উদ্বেগ রক্ষা করছে ... আপনার যদি আইটেমগুলি এড়ানো প্রয়োজন হয় তবে কেবল লুপটির শরীরে একটি ব্যবহার করুন ।MoveNext()
Current
foreach
continue
এবং কেবল সম্পূর্ণতার জন্য, আপনি আপনার সূচকের সাথে কী করছেন তার উপর নির্ভর করে (উপরের কনস্ট্রাক্টগুলি প্রচুর নমনীয়তা দেয়) আপনি সমান্তরাল লিনকিউ ব্যবহার করতে পারেন:
// First, filter 'e' based on 'i',
// then apply an action to remaining 'e'
collection
.AsParallel()
.Where((e,i) => /* filter with e,i */)
.ForAll(e => { /* use e, but don't modify it */ });
// Using 'e' and 'i', produce a new collection,
// where each element incorporates 'i'
collection
.AsParallel()
.Select((e, i) => new MyWrapper(e, i));
আমরা AsParallel()
উপরে ব্যবহার করেছি , কারণ এটি ইতিমধ্যে 2014, এবং আমরা জিনিসগুলি গতি বাড়ানোর জন্য এই একাধিক কোরগুলির ভাল ব্যবহার করতে চাই। আরও 'সিক্যুয়াল' লাইনকিউয়ের জন্য আপনি কেবলমাত্র একটি ForEach()
এক্সটেনশন পদ্ধতি চালু রাখবেন List<T>
এবংArray
... এবং এটি এখনও স্পষ্ট নয় যে এটি ব্যবহার করা কোনও সরল কাজ করার চেয়ে আরও ভাল কিছু foreach
, যেহেতু আপনি এখনও কুরুচিপূর্ণ সিনট্যাক্সের জন্য একক থ্রেডেড চালাচ্ছেন।