আমি কীভাবে একটি `foreach` লুপের পুনরাবৃত্তিটি এড়িয়ে যাব?


324

পার্লে আমি একটি next;কমান্ড দিয়ে একটি অগ্রণী (বা কোনও লুপ) পুনরাবৃত্তি এড়িয়ে যেতে পারি ।

কোনও পুনরাবৃত্তিটি এড়াতে এবং সি # এর পরবর্তী লুপটিতে ঝাঁপ দেওয়ার কোনও উপায় আছে কি?

 foreach (int number in numbers)
 {
     if (number < 0)
     {
         // What goes here to skip over the loop?
     }

     // otherwise process number
 }

তাদের খারাপ ইনপুট দিয়ে ব্যবহারকারীকে অবহিত করা এড়িয়ে যাওয়ার মতো গুরুত্বপূর্ণ!
দরকারী

উত্তর:


664

তুমি চাও:

foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

continueকীওয়ার্ড সম্পর্কে আরও এখানে ।


আপডেট: মন্তব্যে ব্রায়ানের ফলো আপ প্রশ্নের জবাবে:

আপনি কি আরও স্পষ্ট করে বলতে পারবেন যে আমি যদি লুপগুলি নেস্ট করে থাকি এবং প্রসারিতগুলির মধ্যে একটির পুনরাবৃত্তিটি এড়িয়ে যেতে চাইতাম?

for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}

একটি continueসর্বদা নিকটতম ঘেরের স্কোপগুলিতে প্রযোজ্য, তাই আপনি এটি বাইরেরতম লুপটি ভেঙে ফেলার জন্য ব্যবহার করতে পারেন না। যদি এর মতো একটি পরিস্থিতি দেখা দেয় breakতবে আপনার অভ্যন্তরীণ লুপ থেকে, তারপরে continueবাইরের লুপের মতো ঠিক কী চান তার উপর নির্ভর করে আপনাকে আরও জটিল কিছু করতে হবে । breakকীওয়ার্ডের নথির জন্য এখানে দেখুন । breakC # এর শব্দ পার্ল অনুরূপ lastশব্দ।

এছাড়াও, আপনি পূর্বে প্রক্রিয়া করতে চান না এমন মানগুলি কেবল ফিল্টার করে দেওয়ার জন্য ডাস্টিনের পরামর্শটি বিবেচনা করুন:

foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}

আপনি কি আরও স্পষ্ট করে বলতে পারবেন যে আমি যদি লুপগুলি নেস্ট করে থাকি এবং প্রসারিতগুলির কোনওটির পুনরাবৃত্তিটি এড়িয়ে যেতে চাইতাম? উদা: {(সংখ্যায় int- এ সংখ্যা) {// যদি চান (নম্বর / numberarrays) ঝাঁপ করতে} এর জন্য} (int- এ [] numberarrays সংখ্যা) এর জন্য
ব্রায়ান

goto@ ব্রায়ান যে পরিস্থিতি সম্পর্কে জিজ্ঞাসা করছে তার জন্য সি # এর আসলে কার্যকর। nextArray:বাইরের লুপের নীচে যেমন একটি লেবেল যুক্ত করুন এবং তারপরে goto nextArray;আপনি যখন এড়িয়ে যেতে চান।
জ্যাকব ক্রোল

55

লুপটি কার্যকর হওয়ার আগে লিনকিউ ব্যবহার করে ফিল্টার করা অন্য পদ্ধতি:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}

2
+1 টি। যদিও এটি প্রশ্নের সরাসরি প্রতিক্রিয়া নয়, বাস্তবে আমি প্রস্তাবিতটির চেয়ে সম্ভবত এই সমাধানটি পছন্দ করব। লিনকিউ ব্যবহার করা আপনার লুপের মানগুলি প্রক্রিয়া করতে চান না এমন ফিল্টার আউট করার জন্য একটি ভাল সাধারণ ব্যবহারের ক্ষেত্রে বলে মনে হয়।
জন ফেমেনিলা 14

3
এটি কি খুব পরিপাটি বা ভবিষ্যদ্বাণী করার কম আছে এটার পক্ষে কি আরও দ্রুততর হবে? আমি অনুমান করছি যে লিনকিউ ব্যাপকভাবে অনুকূলিত হয়েছে তবে লিনকিউ বিভাগটি কোনও পর্যায়ে ভবিষ্যদ্বাণী করতে হবে তাই তাত্ত্বিকভাবে যদি ডেটাসেটটি বড় হয় এবং ফলস্বরূপ 'ফিল্টারড' সাবসেটটি প্রায় তত বড় হয় তবে ভবিষ্যদ্বাণীটি হওয়ার কারণে এটি ধীর হবে be দুইবার? সুতরাং সম্ভবত এটি প্রত্যাশিত ফলাফল সাব-ডেটাসেটের উপর নির্ভর করে?
কোপস

25

আপনি যদি পরীক্ষাটি ফ্লিপ করতে পারেন তবে:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }

:) ধন্যবাদ! আমি একটি বেসিক উদাহরণ নিয়ে এসেছি কারণ লুপের শুরুতে এমন কিছু মানদণ্ড ছিল যা প্রক্রিয়া করার প্রয়োজন হবে না এবং অন্যরাও যেগুলি ত্রুটি ছিল যা ধরা পড়েছিল।
ব্রায়ান

4
একটি লিনকিউ ভিত্তিক উত্তরটি দুর্দান্ত এবং এতে এক কমনীয়তা রয়েছে তবে যদি একটি বিবৃতি ব্যবহার করা ভুল হয় না।
ক্র্যাশস্ট্রিট


16

আপনি continueবিবৃতি ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}

16

লিনাক ব্যবহারের আরেকটি পদ্ধতি হ'ল:

foreach ( int number in numbers.Skip(1))
{   
    // process number  
}

আপনি যদি প্রথমে কিছু আইটেম এড়িয়ে যেতে চান।

অথবা .SkipWhereআপনি যদি এড়িয়ে যাওয়ার জন্য কোনও শর্ত নির্দিষ্ট করতে চান তবে ব্যবহার করুন ।


এটি করার সর্বাধিক সহজ (যদিও ভিতরে ভিতরে যুক্তি একই হতে পারে) - এখন আপনি লিনক উপলব্ধ। যদিও আপনার এটি নিশ্চিত করা উচিত performance (হ্যাঁ, আমি এখন দেখতে পাচ্ছি যে এটি ওপির প্রশ্নের সরাসরি উত্তর নয়, যদিও উত্তরগুলির এই তালিকায় একটি মূল্যবান সংযোজন)। +1
বি চার্লস এইচ

8

চালিয়ে যাওয়া বিবৃতি ব্যবহার করুন:

foreach(object number in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }

3
কেন এটি upvated হয় বুঝতে পারছেন না, যেহেতু তিনি "o" লুপ করেছেন, "সংখ্যা" নয়
ফরচুন

সম্মত, সম্ভবত এটি পূর্ববর্তী উত্তরগুলি থেকে একটি অনুলিপি / পেস্ট? এটি পূর্ববাচক হিসাবে ধারণাগতভাবে মূল্যবান, তবে দয়া করে ভেরিয়েবলগুলি সুসংগত তা নিশ্চিত করুন।
আন্তোনিও সিওলিনো

0

এটি করার সহজতম উপায় নীচের মত:

//Skip First Iteration

foreach ( int number in numbers.Skip(1))

//Skip any other like 5th iteration

foreach ( int number in numbers.Skip(5))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.