সি / সি # / সি ++ এ পিছনের দিকের লুপটি করার সর্বোত্তম উপায় কী?


101

একটি অ্যারের মাধ্যমে আমার পিছন দিকে যেতে হবে, সুতরাং আমার কাছে এই জাতীয় কোড রয়েছে:

for (int i = myArray.Length - 1; i >= 0; i--)
{
    // Do something
    myArray[i] = 42;
}

এটি করার আরও ভাল উপায় আছে?

আপডেট: আমি আশা করছিলাম যে সম্ভবত সি # এর মতো কিছু বিল্ট-ইন মেকানিজম রয়েছে:

foreachbackwards (int i in myArray)
{
    // so easy
}

আপডেট 2: আছে আছে ভাল উপায়। রুন এই পুরষ্কারটি গ্রহণ করে:

for (int i = myArray.Length; i-- > 0; )
{    
    //do something
}
//or
for (int i = myArray.Length; i --> 0; )
{
    // do something
}

যা নিয়মিত সিতে আরও ভাল দেখাচ্ছে (টোভোমিজকে ধন্যবাদ):

for (int i = lengthOfArray; i--; )
{    
    //do something
}

আমি নিশ্চিত নই যে আমি বিকল্পগুলির যে কোনওটি কেন ভাল, যদি ধার্মিকতার মধ্যে স্পষ্টতা বা রক্ষণাবেক্ষণের অন্তর্ভুক্ত থাকে তবে আমি দেখতে পাচ্ছি।
dkretz

সত্য। আমি এটি করার জন্য আরও যুক্তিসঙ্গত উপায় খুঁজে প্রত্যাশা করছিলাম, যেহেতু আমাকে প্রায়শই প্রায়শই এটি করতে হয়।
মুসিজেনেসিস

3
এই প্রশ্নের বেশিরভাগটি নীচের উত্তরগুলির পর্যালোচনার ধরণের। এটি উল্লেখযোগ্যভাবে সংক্ষিপ্ত করা পরামর্শ দিন।
einpoklum

শিরোনাম এবং হ্যাশট্যাগগুলি থেকে সি এবং সি ++ সরান remove
jaskmar

উত্তর:


148

স্বীকার করার পরে কিছুটা অস্পষ্ট হলেও, আমি বলব যে এটি করার জন্য সবচেয়ে টাইপোগ্রাফিকভাবে আনন্দদায়ক উপায়

for (int i = myArray.Length; i --> 0; )
{
    //do something
}

32
আমি যখন আপনার উত্তরটি প্রথম পড়েছিলাম তখন মনে হয়েছিল এটি সংকলনও করে না, তাই আমি ধরে নিয়েছিলাম আপনি একজন পাগল ব্যক্তি। তবে এটি ঠিক আমি সন্ধান করছিলাম: লুপের জন্য পিছনের দিকে লেখার আরও ভাল উপায়।
মুসিজিনিসিস

3
আমি মনে করি যে আমি -> 0; উদ্দেশ্য হয়। তিনি "টাইপোগ্রাফিকভাবে আনন্দদায়ক" বলতে যা বোঝায়
জোহানেস স্কাউব - lit

16
আমি এটি "টাইপোগ্রাফিকভাবে বিভ্রান্তি" পেয়েছি। আমার জন্য, "-" এটি সঠিকভাবে দেখায় না যতক্ষণ না এটি ভেরিয়েবলের সাথে সংযুক্ত থাকে it's
মুশিজেসিস

26
এটি খুব অস্পষ্ট এবং অবরুদ্ধ। আমি প্রযোজনা কোডে এর মতো কিছু কখনই লিখতে পারি না ...
মিহাই টডর

9
আঃ দি অপারেটরে যায় (->) কৌতুক করে!
নওফাল

118

সি ++ এ আপনার পুনরুক্তি বা সূচকগুলি ব্যবহার করে পুনরাবৃত্তি করার মধ্যে মৌলিকভাবে পছন্দ রয়েছে। আপনার প্লেইন অ্যারে রয়েছে বা না এর উপর নির্ভর করে std::vectorআপনি বিভিন্ন কৌশল ব্যবহার করেন।

স্টাড :: ভেক্টর ব্যবহার করে

পুনরুক্তি ব্যবহার করে

সি ++ আপনাকে এটি ব্যবহার করে অনুমতি দেয় std::reverse_iterator:

for(std::vector<T>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it) {
    /* std::cout << *it; ... */
}

সূচকগুলি ব্যবহার করে

স্বাক্ষরবিহীন ইন্টিগ্রাল টাইপটি সর্বদা std::vector<T>::sizeহয় নাstd::size_t । এটি আরও বেশি বা কম হতে পারে। লুপটি কাজ করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ।

for(std::vector<int>::size_type i = someVector.size() - 1; 
    i != (std::vector<int>::size_type) -1; i--) {
    /* std::cout << someVector[i]; ... */
}

এটি কাজ করে, যেহেতু স্বাক্ষরবিহীন ইন্টিগ্রাল ধরণের মানগুলি বিটগুলির গণনাকে মডুলোর মাধ্যমে সংজ্ঞায়িত করা হয়। এইভাবে, যদি আপনি সেট করছেন-N শেষ করেন(2 ^ BIT_SIZE) -N

অ্যারে ব্যবহার করে

পুনরুক্তি ব্যবহার করে

আমরা std::reverse_iteratorপুনরাবৃত্তি করতে ব্যবহার করছি।

for(std::reverse_iterator<element_type*> it(a + sizeof a / sizeof *a), itb(a); 
    it != itb; 
    ++it) {
    /* std::cout << *it; .... */
}

সূচকগুলি ব্যবহার করে

আমরা std::size_tএখানে নিরাপদে এখানে ব্যবহার করতে পারি, উপরের বিপরীতে, যেহেতু sizeofসর্বদা std::size_tসংজ্ঞা অনুসারে ফিরে আসে ।

for(std::size_t i = (sizeof a / sizeof *a) - 1; i != (std::size_t) -1; i--) {
   /* std::cout << a[i]; ... */
}

পয়েন্টারগুলিতে প্রয়োগ করা আকারের সমস্যাগুলি এড়ানো

আসলে অ্যারের আকার নির্ধারণের উপরের উপায়টি স্তন্যপান করে। যদি আসলে একটি অ্যারের পরিবর্তে পয়েন্টার হয় (যা প্রায়শই ঘটে থাকে, এবং প্রাথমিকভাবে এটি বিভ্রান্ত করবে), এটি নিঃশব্দে ব্যর্থ হবে। একটি আরও ভাল উপায় নিম্নলিখিত ব্যবহার করা হয়, যা সংকলন সময়ে ব্যর্থ হবে, যদি একটি পয়েন্টার দেওয়া হয়:

template<typename T, std::size_t N> char (& array_size(T(&)[N]) )[N];

এটি প্রথমে পাস করা অ্যারের আকার পেয়ে কাজ করে এবং তারপরে একই আকারের টাইপের চরের অ্যারেতে কোনও রেফারেন্স ফেরত দেওয়ার ঘোষণা দিয়ে কাজ করে। charএটির সংজ্ঞা দেওয়া হয়েছে sizeof: ১. সুতরাং ফিরে আসা অ্যারেগুলির একটি sizeofহ'ল: এন * 1, যা আমরা যা খুঁজছি কেবল সংকলন সময় মূল্যায়ন এবং শূন্য রানটাইম ওভারহেড সহ।

পরিবর্তে না

(sizeof a / sizeof *a)

আপনার কোডটি পরিবর্তন করুন যাতে এটি এখন করে

(sizeof array_size(a))

অতিরিক্তভাবে, যদি আপনার ধারকটির
doc

আপনার অ্যারে_সাইজ স্থিতিশীলভাবে বরাদ্দ করা অ্যারেগুলির জন্য কাজ করে বলে মনে হচ্ছে তবে উদাহরণস্বরূপ যখন আমার জন্য 'নতুন ইনট []]' ছিল তখন আমার জন্য ব্যর্থ হয়েছিল।
নাট পার্সনস

2
হ্যাঁ এটি এর উদ্দেশ্য: নতুন ইন [7] একটি পয়েন্টার দেয়। সুতরাং আকারের (নতুন ইনট [7]) 7 * আকারের (ইনট) না, তবে আকার (ইনট *) প্রত্যাবর্তন করবে। অ্যারে_সাইজ চুপ করে কাজ না করে সেই ক্ষেত্রে একটি সংকলন ত্রুটির সৃষ্টি করে।
জোহানেস স্কাউব -

এছাড়াও অ্যারে_ সাইজ (+ স্ট্যাটিকালি_লোক্যাটেড_আরে) চেষ্টা করুন, যা ব্যর্থও হয়, কারণ + অপারেটর অ্যারেটিকে তার প্রথম উপাদানটির জন্য একটি পয়েন্টারে পরিণত করে। সরল আকারের ব্যবহার করে আপনাকে আবার একটি পয়েন্টারের আকার দিতে হবে
জোহানেস স্কাউব - লিটব

প্রথম জিনিসটির জন্য - কেন কেবল ব্যবহার endএবং beginবিপরীত ক্রমে নয়?
টোমা জ্যাটো - মনিকা পুনরায় ইনস্টল করুন 6'16

54

সি # তে , ভিজ্যুয়াল স্টুডিও 2005 বা তার পরে ব্যবহার করে, 'ফোর' টাইপ করুন এবং [টিএবি] [টিএবি] টিপুন । এটি এমন একটি forলুপে প্রসারিত হবে যা কোনও সংগ্রহের মধ্য দিয়ে পিছনের দিকে যায়।

ভুল হওয়া এত সহজ (কমপক্ষে আমার জন্য), আমি ভেবেছিলাম এই স্নিপেটটি রাখা ভাল ধারণা হবে।

এটি বলেছিল, আমি পছন্দ করি Array.Reverse()/ Enumerable.Reverse()এবং তারপরে ফরোয়ার্ডগুলি আরও ভালভাবে পুনরাবৃত্তি করতে পারি - তারা আরও স্পষ্টভাবে উদ্দেশ্য বলে state


41

আমি সর্বদা ' টাইপোগ্রাফিকভাবে সন্তোষজনক ' কোডের বিরুদ্ধে পরিষ্কার কোড পছন্দ করি prefer সুতরাং, আমি সর্বদা ব্যবহার করব:

for (int i = myArray.Length - 1; i >= 0; i--)  
{  
    // Do something ...  
}    

আপনি এটিকে পিছনের দিকে লুপ করার মানক উপায় হিসাবে বিবেচনা করতে পারেন।
শুধু আমার দুটি সেন্ট ...


কাজ করছে. এটি এখনও সি # তে করেন নি, তবে আপনাকে ধন্যবাদ।
PCPGMR

সুতরাং যদি অ্যারেটি সত্যিই বড় হয় (সুতরাং সূচিটি স্বাক্ষরবিহীন টাইপের হতে হবে)? সাইজ_টি আসলে স্বাক্ষরবিহীন, তাই না?
লালালা

আপনি আমি uint হিসাবে ঘোষণা করতে পারেন। মার্ক গ্রাভেল এর পোস্ট দেখুন।
জ্যাক গ্রিফিন

মুদ্রণের কারণে স্বাক্ষরবিহীন প্রকারের জন্য কাজ করবেন না, টাইপোগ্রাফিকভাবে সন্তুষ্ট করার মতো। ভাল না.
ওসেলোট

17

ইন সি # ব্যবহার Linq :

foreach(var item in myArray.Reverse())
{
    // do something
}

এটি অবশ্যই সহজ, তবে লক্ষ্য করুন যে সিএলআরের বর্তমান সংস্করণে একটি তালিকা বিপরীত করা সর্বদা ও (1) অপারেশন না হয়ে একটি ও (এন) অপারেশন হয় যদি এটি আইলিস্ট থাকে <T>; কানেক্ট.মাইক্রোসফট.
গ্রেগ বিচ

1
দেখে মনে হচ্ছে। বিপরীত () অ্যারের একটি স্থানীয় অনুলিপি তৈরি করে এবং তারপরে পিছনে পুনরাবৃত্তি করে। অ্যারের অনুলিপি করা ঠিক একরকম অক্ষম বলে মনে হচ্ছে যাতে আপনি এটির মাধ্যমে পুনরাবৃত্তি করতে পারেন। আমি অনুমান করি যে এতে "লিনক" সহ যে কোনও পোস্টই আপ-ভোজনের যোগ্য। :)
MusiGenesis

একটি সম্ভাব্য ট্রেডঅফ রয়েছে, তবে তারপরে আপনি এই ইস্যুটি চালিয়ে যাবেন যে "উত্তরটিতে ভোট দিয়েছেন" (i -> 0) এর ফলে ধীর কোড হতে পারে কারণ (i) প্রতিবার অ্যারের আকারের বিপরীতে পরীক্ষা করতে হবে সূচক হিসাবে ব্যবহৃত।
কেলটেক্স

1
যদিও আমি সম্মত হই যে লিনক দুর্দান্ত, এই পদ্ধতির সাথে সমস্যাটি হ'ল কোনও পুনরুক্তিকারী আপনাকে নির্বাচিতভাবে অ্যারের আইটেমগুলি বাছাই করতে দেয় না - আপনি অ্যারের কোনও অংশে চলাচল করতে চান সেই পরিস্থিতিটি বিবেচনা করুন, তবে সম্পূর্ণ নয় জিনিস ...
jesses.co.tt

11

এটি অবশ্যই এমন কোনও অ্যারের পক্ষে সর্বোত্তম উপায় যার দৈর্ঘ্য একটি স্বাক্ষরিত ইন্টিগ্রাল টাইপ। যে অ্যারেগুলির দৈর্ঘ্য একটি স্বাক্ষরবিহীন ইন্টিগ্রাল টাইপ (উদাহরণস্বরূপ std::vectorসি ++ তে একটি), তারপরে আপনাকে শেষের অবস্থাটি সামান্য পরিবর্তন করতে হবে:

for(size_t i = myArray.size() - 1; i != (size_t)-1; i--)
    // blah

আপনি যদি কেবল বলেছেন i >= 0, এটি স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য সর্বদা সত্য, সুতরাং লুপটি হবে অসীম লুপ।


সি ++ এ "আমি--" স্বয়ংক্রিয়ভাবে সর্বোচ্চ মানের সাথে প্রায় लपेटব যদি আমি 0 হত? দুঃখিত, আমি সি ++ প্রতিবন্ধী।
মুসিজিনিস

অ্যামেজিং। আপনারা 12 বছর আগে আমার লেখা কিছুতে হার্ড-ড্রাইভ ফিলিং বাগের কারণটি বুঝতে কেবল আমাকে সাহায্য করেছেন। ভাল জিনিস আমি সি ++ এ কাজ করি না।
মুসিজিনিস

সমাপ্তির শর্তটি হওয়া উচিত: i <myArray.size ()। কেবল স্বাক্ষরবিহীন ইন্টের ওভারফ্লো বৈশিষ্ট্যের উপর নির্ভর করে; পূর্ণসংখ্যা এবং ক্যাসেটগুলির বাস্তবায়ন বিবরণ নয়। ফলস্বরূপ পড়া সহজ এবং বিকল্প পূর্ণসংখ্যার উপস্থাপনা সহ ভাষাগুলিতে কাজ করে।
এজগোটল

আমি মনে করি আমার পক্ষে আরও ভাল সমাধান হ'ল সি # বিশ্বে থাকা যেখানে আমি কাউকে আঘাত করতে পারি না।
মুসিজিনিস

4

আমার কাছে ভালই লাগছে. যদি সূচকটি স্বাক্ষরবিহীন হয় (uint ইত্যাদি), আপনাকে এটি অ্যাকাউন্টে নিতে হবে। আমাকে অলস বলুন, তবে সেই (স্বাক্ষরযুক্ত) ক্ষেত্রে আমি কেবল একটি পাল্টা পরিবর্তনশীল ব্যবহার করতে পারি:

uint pos = arr.Length;
for(uint i = 0; i < arr.Length ; i++)
{
    arr[--pos] = 42;
}

(প্রকৃতপক্ষে, এমনকি এখানেও আপনাকে এআরআইরএইচ-লেংথ = uint.MaxValue এর মতো মামলার বিষয়ে সতর্কতা অবলম্বন করা দরকার ... সম্ভবত একটি! = কোথাও ... অবশ্যই এটি খুব সম্ভাবনাময় ঘটনা!)


যদিও "--pos" জিনিসটি জটিল। আমি অতীতে সহকর্মী ছিলাম যারা কোডগুলিতে এলোমেলোভাবে "সংশোধন" করার বিষয়গুলির খুব পছন্দ করতেন যা তাদের কাছে একেবারেই সঠিক ছিল না।
মুসিজিনিস

1
তারপরে .arr.Length-1 এবং pos-- ব্যবহার করুন
মার্ক গ্র্যাভেল

4

সিআই তে এটি করতে পছন্দ করুন:


int i = myArray.Length;
while (i--) {
  myArray[i] = 42;
}

সি # উদাহরণ মুসিজেনেসিস যুক্ত করেছেন:

{int i = myArray.Length; while (i-- > 0)
{
    myArray[i] = 42;
}}

আমি এই পছন্দ। আপনার পদ্ধতিটি কাজ করে তা বুঝতে দু'একটি সময় লেগেছিল। আশা করি আপনি যুক্ত সি # সংস্করণটিকে কিছু মনে করবেন না (অতিরিক্ত ধনুর্বন্ধনী যাতে সূচকটি লুপের মতো হয়)।
মুসিজিনিসিস

আমি নিশ্চিত নই যে আমি এটি উত্পাদন কোডে ব্যবহার করব, কারণ এটি সর্বজনীন "ডাব্লুটিএফ এটি কি?" যার যার প্রতিক্রিয়া এটি বজায় রাখতে হয়েছিল তবে লুপের জন্য এটি স্বাভাবিকের চেয়ে টাইপ করা আসলে সহজ এবং কোনও বিয়োগ চিহ্ন বা> = চিহ্ন নেই ols
মুসিজেনেসিস

1
খুব খারাপ সি সি সংস্করণের অতিরিক্ত "> 0" দরকার।
মুসিজেনিসিস

আমি কোন ভাষা তা নিশ্চিত নই। তবে আপনার প্রথম কোড স্নিপেট অবশ্যই সিটি নয় :) কেবল আপনাকে স্পষ্ট করে বলার জন্য। হতে পারে আপনি সি # লিখতে চেয়েছিলেন এবং এইচটিএমএল এটি বা অন্য কিছুকে বিশ্লেষণ করতে ব্যর্থ হয়েছে?
জোহানেস স্কাউব -

@ লিটব: আমি অনুমান করি "মাইআরএই। দৈর্ঘ্য" বৈধ সি (?) নয়, তবে লুপ অংশটি কাজ করে এবং দুর্দান্ত দেখায়।
মুসিজিনিস

3

সি ++ এ করার সর্বোত্তম উপায়টি সম্ভবত পুনরাবৃত্তকারী (বা আরও ভাল, পরিসর) অ্যাডাপ্টার ব্যবহার করা হবে, যা অলসভাবে ক্রমটিকে অনুসরণ করার সাথে সাথে ক্রমটি রূপান্তরিত করবে।

মূলত,

vector<value_type> range;
foreach(value_type v, range | reversed)
    cout << v;

বিপরীত ক্রমে "ব্যাপ্তি" সীমাটি প্রদর্শন করুন (এখানে, এটি খালি, তবে আমি নিশ্চিত যে আপনি নিজেরাই উপাদান যুক্ত করতে পারবেন) re অবশ্যই কেবল পরিসীমা পুনরাবৃত্তি করা খুব বেশি ব্যবহার নয়, তবে সেই নতুন পরিসরটি অ্যালগরিদম এবং স্টাফগুলিতে পাস করা বেশ দুর্দান্ত।

এই প্রক্রিয়াটি আরও বেশি শক্তিশালী ব্যবহারের জন্য ব্যবহার করা যেতে পারে:

range | transformed(f) | filtered(p) | reversed

অলসভাবে পরিসীমা "পরিসীমা" গণনা করবে, যেখানে ফাংশন "f" সমস্ত উপাদানগুলিতে প্রয়োগ করা হয়, যে উপাদানগুলির জন্য "পি" সত্য নয় তা সরানো হয় এবং শেষ পর্যন্ত ফলাফলটি পরিসীমাটি বিপরীত হয়।

পাইপ সিনট্যাক্সটি সর্বাধিক পঠনযোগ্য আইএমও, এটি ইনফিক্সের ভিত্তিতে। বুস্ট.রেঞ্জ লাইব্রেরি আপডেটের মুলতুবি পর্যালোচনা এটি প্রয়োগ করে তবে এটি নিজেই করা এটি বেশ সহজ। এটি ল্যাম্বডা ডিএসইএল এর সাথে আরও বেশি দুর্দান্ত ফাংশন এফ এবং লাইন প্রেডিকেট পি তৈরি করতে।


আপনি আমাদের বলতে পারেন যে আপনি কোথা থেকে "ফোরচ" করেছেন? এটি কি BOOST_FOREach এর একটি # সংজ্ঞা? পুরোপুরি দেখতে সুন্দর লাগছে।
জোহানেস স্কাউব -


1

আমি কিছুক্ষণ লুপ পছন্দ করি। এটি iলুপের জন্য শর্ত কমে যাওয়ার চেয়ে আমার কাছে আরও স্পষ্ট

int i = arrayLength;
while(i)
{
    i--;
    //do something with array[i]
}

0

আমি মূল প্রশ্নে কোডটি ব্যবহার করব, তবে আপনি যদি সত্যিই ভবিষ্যদ্বাণী ব্যবহার করতে চান এবং সি # তে একটি পূর্ণসংখ্যা সূচক পেতে চান:

foreach (int i in Enumerable.Range(0, myArray.Length).Reverse())
{
    myArray[i] = 42; 
}

-1

আমি এখানে আমার নিজের প্রশ্নের উত্তর দেওয়ার চেষ্টা করতে যাচ্ছি, তবে আমি আসলে এটি পছন্দ করি না:

for (int i = 0; i < myArray.Length; i++)
{
    int iBackwards = myArray.Length - 1 - i; // ugh
    myArray[iBackwards] = 666;
}

পরিবর্তে। দৈর্ঘ্য - 1 - আমি প্রতিটি সময়, সম্ভবত একটি দ্বিতীয় পরিবর্তনশীল বিবেচনা? আমার [আপডেট করা] পোস্টটি দেখুন।
মার্ক গ্র্যাভেল

আমার নিজের প্রশ্নে ভোট দিয়েছি। হর্ষ। এটি আসলটির চেয়ে কোনও গোঁড়া নয়।
মুসিজিনিস

-4

দ্রষ্টব্য: এই পোস্টটি আরও বিশদজনক এবং অতএব বিষয়টি বন্ধ হয়ে গেছে, আমি ক্ষমাপ্রার্থী।

বলা হচ্ছে যে আমার সহকর্মীরা এটি পড়ে এবং বিশ্বাস করে যে এটি 'কোথাও' মূল্যবান। এই থ্রেডটি জায়গা নয়। এটি কোথায় যেতে হবে সে সম্পর্কে আমি আপনার প্রতিক্রিয়াটির প্রশংসা করব (সাইটে আমি নতুন)


যাইহোক এটি .NET 3.5 এর সি # সংস্করণ যা এটি আশ্চর্যজনক যে এটি সংজ্ঞায়িত শব্দার্থক শব্দ ব্যবহার করে যে কোনও সংগ্রহের ধরণে কাজ করে। এটি একটি ডিফল্ট পরিমাপ (পুনঃব্যবস্থা!) বেশিরভাগ সাধারণ দেব দৃশ্যে পারফরম্যান্স বা সিপিইউ চক্র হ্রাস নয়, যদিও বাস্তবে যা ঘটে তা কখনও মনে হয় না (অকাল অপ্টিমাইজেশন)।

*** কোনও সংগ্রহের ধরণের উপরে কাজ করে এক্সটেনশন পদ্ধতি এবং প্রকারের একক মান প্রত্যাশী একটি ক্রিয়া প্রতিনিধি গ্রহণ, সমস্ত আইটেমের বিপরীতে কার্যকর করা হয় **

৩.৩ রেখা:

public static void PerformOverReversed<T>(this IEnumerable<T> sequenceToReverse, Action<T> doForEachReversed)
      {
          foreach (var contextItem in sequenceToReverse.Reverse())
              doForEachReversed(contextItem);
      }

পুরানো। নেট সংস্করণ বা আপনি লিনক ইন্টার্নাল আরও ভাল বুঝতে চান? পড়ুন .. না ..

সংক্ষিপ্তকরণ:। নেট টাইপ সিস্টেমে অ্যারে টাইপটি আইইনুমেবল ইন্টারফেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় (জেনেরিক আইইনিউমারেবল কেবল আইইনামেবল নয়)।

আপনাকে শুরু থেকে শেষ পর্যন্ত পুনরাবৃত্তি করতে হবে এটি তবে এটি আপনি বিপরীত দিকে যেতে চান। যেহেতু আইনুনামেবল অ্যারেতে 'অবজেক্ট' টাইপের যেকোন প্রকারের বৈধ,

গুরুতর ব্যবস্থা: আমরা ধরে নিই যে আপনি যদি বিপরীত ক্রমে কোনও ক্রমটি প্রক্রিয়া করতে পারেন যা 'ভাল' হয় তবে এটি কেবল পূর্ণসংখ্যায় করতে সক্ষম হয়।

নেট সিএলআর ২.০-৩.০ এর জন্য একটি সমাধান করুন:

বিবরণ: আমরা যেকোনো মূলনামা প্রয়োগকারী উদাহরণ ম্যান্ডেট সহ গ্রহণ করব যা এতে অন্তর্ভুক্ত প্রতিটি উদাহরণ একই ধরণের। সুতরাং আমরা যদি একটি অ্যারে গ্রহণ করি তবে পুরো অ্যারেতে X টাইপের উদাহরণ রয়েছে other অন্য কোনও উদাহরণ যদি টাইপের হয়! = এক্স ব্যতিক্রম নিক্ষেপ করা হয়:

একটি সিঙ্গলটন পরিষেবা:

পাবলিক ক্লাস রিভার্সার সার্ভিস {ব্যক্তিগত রিভার্সার সার্ভিস () {}

    /// <summary>
    /// Most importantly uses yield command for efficiency
    /// </summary>
    /// <param name="enumerableInstance"></param>
    /// <returns></returns>
    public static IEnumerable ToReveresed(IEnumerable enumerableInstance)
    {
        if (enumerableInstance == null)
        {
            throw new ArgumentNullException("enumerableInstance");
        }

        // First we need to move forwarad and create a temp
        // copy of a type that allows us to move backwards
        // We can use ArrayList for this as the concrete
        // type

        IList reversedEnumerable = new ArrayList();
        IEnumerator tempEnumerator = enumerableInstance.GetEnumerator();

        while (tempEnumerator.MoveNext())
        {
            reversedEnumerable.Add(tempEnumerator.Current);
        }

        // Now we do the standard reverse over this using yield to return
        // the result
        // NOTE: This is an immutable result by design. That is 
        // a design goal for this simple question as well as most other set related 
        // requirements, which is why Linq results are immutable for example
        // In fact this is foundational code to understand Linq

        for (var i = reversedEnumerable.Count - 1; i >= 0; i--)
        {
            yield return reversedEnumerable[i];
        }
    }
}



public static class ExtensionMethods
{

      public static IEnumerable ToReveresed(this IEnumerable enumerableInstance)
      {
          return ReverserService.ToReveresed(enumerableInstance);
      }
 }

[টেস্টফিসচার] পাবলিক ক্লাস টেস্টিং 123 {

    /// <summary>
    /// .NET 1.1 CLR
    /// </summary>
    [Test]
    public void Tester_fornet_1_dot_1()
    {
        const int initialSize = 1000;

        // Create the baseline data
        int[] myArray = new int[initialSize];

        for (var i = 0; i < initialSize; i++)
        {
            myArray[i] = i + 1;
        }

        IEnumerable _revered = ReverserService.ToReveresed(myArray);

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));
    }

    [Test]
    public void tester_why_this_is_good()
    {

        ArrayList names = new ArrayList();
        names.Add("Jim");
        names.Add("Bob");
        names.Add("Eric");
        names.Add("Sam");

        IEnumerable _revered = ReverserService.ToReveresed(names);

        Assert.IsTrue(TestAndGetResult(_revered).Equals("Sam"));


    }

    [Test]
    public void tester_extension_method()
  {

        // Extension Methods No Linq (Linq does this for you as I will show)
        var enumerableOfInt = Enumerable.Range(1, 1000);

        // Use Extension Method - which simply wraps older clr code
        IEnumerable _revered = enumerableOfInt.ToReveresed();

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));


    }


    [Test]
    public void tester_linq_3_dot_5_clr()
    {

        // Extension Methods No Linq (Linq does this for you as I will show)
        IEnumerable enumerableOfInt = Enumerable.Range(1, 1000);

        // Reverse is Linq (which is are extension methods off IEnumerable<T>
        // Note you must case IEnumerable (non generic) using OfType or Cast
        IEnumerable _revered = enumerableOfInt.Cast<int>().Reverse();

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));


    }



    [Test]
    public void tester_final_and_recommended_colution()
    {

        var enumerableOfInt = Enumerable.Range(1, 1000);
        enumerableOfInt.PerformOverReversed(i => Debug.WriteLine(i));

    }



    private static object TestAndGetResult(IEnumerable enumerableIn)
    {
      //  IEnumerable x = ReverserService.ToReveresed(names);

        Assert.IsTrue(enumerableIn != null);
        IEnumerator _test = enumerableIn.GetEnumerator();

        // Move to first
        Assert.IsTrue(_test.MoveNext());
        return _test.Current;
    }
}

2
ডুড বা দুদেট: আমি কেবল লেখার "কম (আঙ্কু আই = মাইআরআরই। দৈর্ঘ্য - 1; i> = 0; i--)" লেখার কম উপায় খুঁজছিলাম।
মিউজিনিসিস

1
এই উত্তরের মোটেও কোনও মূল্য নেই
ম্যাট মেল্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.