একাধিক কেস সুইচ স্টেটমেন্টে


581

case value:বারবার উল্লেখ না করে একাধিক মামলার বিবৃতি দিয়ে যাওয়ার কোনও উপায় আছে কি ?

আমি জানি এই কাজগুলি:

switch (value)
{
   case 1:
   case 2:
   case 3:
      // Do some stuff
      break;
   case 4:
   case 5:
   case 6:
      // Do some different stuff
      break;
   default:
       // Default stuff
      break;
}

তবে আমি এই জাতীয় কিছু করতে চাই:

switch (value)
{
   case 1,2,3:
      // Do something
      break;
   case 4,5,6:
      // Do something
      break;
   default:
      // Do the Default
      break;
}

এই বাক্য গঠনটি কি আমি অন্য ভাষা থেকে ভাবছি, বা আমি কিছু অনুপস্থিত?


আপনি কেবল একটি আইএফ স্টেটমেন্ট ব্যবহার না করার কোনও কারণ রয়েছে (যদি আপনি কিছুটা ইনট পরীক্ষা করে থাকেন)?
এরিক শুনোভার

2
হ্যাঁ চার্লস, প্রথম উপায়টি দুর্দান্তভাবে কাজ করে, আমি এটি বহু জায়গায় ব্যবহার করেছি। এটি আমার চেয়ে নিবিড়, তবে এটি দরকারী। আমি কেবল উদাহরণ হিসাবে সেই পূর্ণসংখ্যার ব্যবহার করেছি। আসল তথ্য আরও বৈচিত্র্যময় ছিল। একটি যদি (1 || 2 || 3) {...} অন্যথায় যদি (4 || 5 || 6) {... too খুব বেশি কাজ করে তবে এটি পড়া শক্ত।
থিও

5
কেন আপনি পূর্বের চেয়ে উত্তরোত্তর গভীর বিবেচনা করেন? পরেরটির আরও একটি অর্থ যুক্ত হয় ,এবং এটি অন্য কোনও সি-শৈলীর ভাষার সাথে ভাগ হয় না। এটা আমার কাছে অনেকটা নিবিড় মনে হবে।
জন হান্না

1
আপনি রুবির কাছ থেকে ২ য় সংশ্লেষটি গ্রহণ করতে পারেন। এটি সেই ভাষায় এটি কীভাবে কাজ করে (যদিও স্যুইচটি কেস হয়ে যায়, এবং যখন অন্যান্য বিষয়গুলির মধ্যেও কেস হয়ে যায়))
juanpaco

4
গুরুত্বপূর্ণ নোট । C # v7 শুরু করে স্যুইচ ক্ষেত্রে রেঞ্জগুলি সমর্থিত - দয়া করে স্টিভ জি এর উত্তর দেখুন
আরবিটি

উত্তর:


313

আপনি উল্লিখিত দ্বিতীয় পদ্ধতির জন্য সি ++ বা সি # তে কোনও বাক্য গঠন নেই।

আপনার প্রথম পদ্ধতিতে কোনও সমস্যা নেই। তবে আপনার যদি খুব বড় পরিসীমা থাকে তবে স্টেটমেন্টগুলির একটি সিরিজ ব্যবহার করুন।


5
সংযোজন হিসাবে আমি এমএসডিএন-তে এমএসডিএন-তে উপলব্ধ সি # ভাষার স্পেসিফিকেশনের লিঙ্কটি যুক্ত করতে চেয়েছিলাম এমএসডিএন.মাইক্রোসফট /en-us/vcsharp/aa336809.aspx
রিচার্ড ম্যাকগুইয়ার

এনামগুলির সেটগুলিতে ইনপুট হ্রাস করতে এবং এনামটি স্যুইচ করতে ব্যবহারকারী কিছু হলে (বা একটি টেবিল সন্ধান) ব্যবহার করতে পারে।
হার্ভে

5
সম্ভবত এটি ভিবি নেট থেকে গ্রহণ করেছেন
জর্জ বীরবিলিস

1
বিভিন্ন কেস স্টেটমেন্টের জন্য ভিবি নেট.ই আরও ভাল ... তারা সি # এর মতো বাদ দেয় না। একটু নিও, একটু দাও।
Brain2000

আমি বিশ্বাস করি এটি আর সঠিক নয়। Stackoverflow.com/questions/20147879/… দেখুন । এছাড়াও এই একই প্রশ্নে একটি উত্তর রয়েছে স্ট্যাকওভারফ্লো.com
ড্যান রেসন

699

আমার ধারণা এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে। তবে, আমি মনে করি যে আপনি এখনও উভয় বিকল্পকে সিন্ট্যাক্টিক্যালি আরও ভাল উপায়ে মিশ্রিত করতে পারেন:

switch (value)
{
    case 1: case 2: case 3:          
        // Do Something
        break;
    case 4: case 5: case 6: 
        // Do Something
        break;
    default:
        // Do Something
        break;
}

3
সি # এর জন্য 'স্যুইচ' লোয়ার কেস হওয়া উচিত?
অস্টিন হ্যারিস

3
সঙ্কুচিত কোডটি প্রশ্নের প্রথম উদাহরণটিতে দীর্ঘায়িত হয়। পাশাপাশি প্রশ্নে এটি ঠিক করুন।
মেটালফিনিক্স

10
কেন বিরক্ত হও? ভিজ্যুয়াল স্টুডিও 2013-এ স্বতঃপ্রবেশকারী এটিকে যাইহোক মূল প্রশ্নে ফর্ম্যাটটিতে ফিরিয়ে আনবে।
গুস্তভ

14
@T_D এটি সমর্থন পাচ্ছে কারণ এটি আসলে প্রশ্নের উত্তর দেয়। ওপি বলেছিল, আমি কি কিছু মিস করছি ... কার্লোস যা হারিয়েছিল তার জবাব দিয়েছিলেন। আমার কাছে বেশ কাটা এবং শুকনো লাগছে। ঘৃণা করবেন না যে তিনি ৪২২ টি আপত্তি পেয়েছেন।
মাইক দেবেনি

8
@ মাইকডেভনি তারপরে আপনি প্রশ্নটিকে অন্যভাবে ব্যাখ্যা করেছেন, যতদূর আমি দেখছি সঠিক উত্তরটি হবে "না, সি # এর পক্ষে কোনও বাক্য গঠন নেই"। যদি কেউ জিজ্ঞাসা করেন যে "আমি কোনও গ্লাসে তরল pourালতে পারছি তবে আমি কী ধরে রেখেছি?" উত্তরটি "না" হওয়া উচিত এবং নয় "আপনি যদি তরলটি pourালতে পারেন তবে আপনি যদি এটির দিকে তাকান এবং নিজের কল্পনাটি ব্যবহার করেন", কারণ এই উত্তরটি সমস্ত কল্পনা ব্যবহারের বিষয়ে। আপনি যদি নিয়মিত সিনট্যাক্স ব্যবহার করেন তবে এটিকে খারাপভাবে ফর্ম্যাট করেন তবে এটি অন্য সিনট্যাক্সের মতো দেখতে কিছুটা কল্পনা দিয়ে। আশা করি আপনি আমার পয়েন্টটি পেয়ে
যাবেন

74

এই বাক্য গঠনটি ভিজ্যুয়াল বেসিক নির্বাচন থেকে ... কেস স্টেটমেন্ট :

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

আপনি এই সিনট্যাক্সটি সি # তে ব্যবহার করতে পারবেন না। পরিবর্তে, আপনাকে অবশ্যই আপনার প্রথম উদাহরণ থেকে বাক্য গঠন ব্যবহার করতে হবে।


49
আমি বেসিক সম্পর্কে যে কয়েকটি জিনিস মিস করছি তার মধ্যে এটি একটি।
নিকফ

10
এখানে আমাদের কয়েকটি ডিসপ্লেগুলির মধ্যে একটি রয়েছে যেখানে ভিজ্যুয়াল বেসিক কদর্য নয়, এবং সি # এর চেয়ে বহুমুখী। এটি একটি মূল্যবান উদাহরণ!
বিজিএম কোডার

এটি বেশ শালীন। আমি অবাক হলাম কেন এটি সি # 8.0 এর সাথে যুক্ত করা হয়নি? বেশ সুন্দর হবে।
সিগেক্স

69

সি # 7 এ (ভিজ্যুয়াল স্টুডিও 2017 /। নেট ফ্রেমওয়ার্ক 4.6.2 এ ডিফল্টরূপে উপলব্ধ) এ, স্যুইচ-ভিত্তিক স্যুইচিং এখন স্যুইচ স্টেটমেন্টের সাহায্যে সম্ভব এবং ওপির সমস্যার সাথে সহায়তা করবে।

উদাহরণ:

int i = 5;

switch (i)
{
    case int n when (n >= 7):
        Console.WriteLine($"I am 7 or above: {n}");
        break;

    case int n when (n >= 4 && n <= 6 ):
        Console.WriteLine($"I am between 4 and 6: {n}");
        break;

    case int n when (n <= 3):
        Console.WriteLine($"I am 3 or less: {n}");
        break;
}

// Output: I am between 4 and 6: 5

মন্তব্য:

  • প্রথম বন্ধনী (এবং শর্তে )প্রয়োজন হয় না when, তবে তুলনা (গুলি) হাইলাইট করার জন্য এই উদাহরণে ব্যবহৃত হয়।
  • varএর বদলেও ব্যবহার করা যেতে পারে int। উদাহরণস্বরূপ: case var n when n >= 7:

3
আপনি অন্যান্য উত্তরগুলির তুলনায় এটি পরিষ্কার করার কারণে আপনি যখন সি # 7.x বা তার বেশি ব্যবহার করতে পারেন তখন এই (প্যাটার্নের মিল) সাধারণত সেরা অনুশীলন হওয়া উচিত।
আনইডিং জেলিফিশ

এনামগুলির তালিকা সহ এটি অর্জনের কোনও উপায় আছে কি? এনামদের মানচিত্র কোথায়?
সিগেক্স

32

আপনি যে নতুন লাইনটি দিয়েছেন তা ছেড়ে দিতে পারেন:

case 1: case 2: case 3:
   break;

তবে আমি সেই খারাপ শৈলী বিবেচনা করি।


20

.NET ফ্রেমওয়ার্ক 3.5 রেঞ্জ পেয়েছে:

এমসডিএন থেকে পরিবর্তন করুন from

আপনি এটি "অন্তর্ভুক্ত" এবং আইএফ স্টেটমেন্ট দিয়ে ব্যবহার করতে পারেন, যেহেতু কেউ বলেছিল যে সুইচ স্টেটমেন্টটি "==" অপারেটর ব্যবহার করে।

এখানে একটি উদাহরণ:

int c = 2;
if(Enumerable.Range(0,10).Contains(c))
    DoThing();
else if(Enumerable.Range(11,20).Contains(c))
    DoAnotherThing();

তবে আমি মনে করি আমরা আরও মজা করতে পারি: যেহেতু আপনাকে ফেরতের মানগুলির প্রয়োজন হবে না এবং এই ক্রিয়াটি প্যারামিটার নেয় না, আপনি সহজেই ক্রিয়া ব্যবহার করতে পারেন!

public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
    if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
        action();
}

এই নতুন পদ্ধতির সাথে পুরানো উদাহরণ:

MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);

যেহেতু আপনি ক্রিয়াগুলি অতিক্রম করছেন, মানগুলি নয়, আপনার প্রথম বন্ধনী বাদ দেওয়া উচিত, এটি অত্যন্ত গুরুত্বপূর্ণ। আপনি আর্গুমেন্ট সহ ফাংশন প্রয়োজন হয়, তাহলে শুধু টাইপ পরিবর্তন Actionকরার Action<ParameterType>। আপনার যদি ফেরতের মান প্রয়োজন হয় তবে ব্যবহার করুন Func<ParameterType, ReturnType>

সি # 3.0 এ কেস প্যারামিটারটি একই বিষয়টিকে সত্যায়িত করতে সহজে আংশিক অ্যাপ্লিকেশন নেই , তবে আপনি একটু সহায়ক পদ্ধতি তৈরি করেন (কিছুটা ভার্বোজ, থো)।

public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){ 
    MySwitchWithEnumerable(3, startNumber, endNumber, action); 
}

পুরানো অপরিহার্য বিবরণীর চেয়ে আইএমএইচও আরও শক্তিশালী এবং মার্জিত হ'ল এখানে কীভাবে নতুন কার্যক্ষম আমদানি করা বিবৃতি রয়েছে example


3
ভাল পছন্দ. তবে একটি বিষয় লক্ষণীয় - গণনাযোগ্য R রেঞ্জের যুক্তি রয়েছে int startএবং int count। আপনার উদাহরণগুলি যেমন লেখা হয়েছিল ঠিক সেভাবে কাজ করবে না। আপনি এটি লিখতে যেমন দ্বিতীয় যুক্তি হয় int end। উদাহরণস্বরূপ - Enumerable.Range(11,20)11 টি দিয়ে 20 টি সংখ্যার ফলাফল হবে এবং 11 থেকে 20 পর্যন্ত সংখ্যা নয়
গ্যাব্রিয়েল ম্যাকএডামস

যদিও, যদি এনামের সাথে কাজ করা হয় তবে কেন এমন কিছু হবে না? if (Enumerable.Range (MyEnum.A, MyEnum.M) {DoTing ();} অন্যথায় যদি (Enumerable.Range (MyEnum.N, MyEnum.Z) {DoAnotherTing ();
David

4
লক্ষ্য করুন Enumerable.Range(11,20).Contains(c)সমতূল্য for(int i = 11; i < 21; ++i){ if (i == c) return true; } return false;আপনি একটি বড় পরিধির এটি একটি দীর্ঘ সময় নিতে হবে, যখন মাত্র ব্যবহার ছিল >এবং <দ্রুত এবং ধ্রুব সময় হতে হবে।
জন হান্না

একটি উন্নতি: MySwitchWithEnumerableফিরে আসা voidএই পরিস্থিতির জন্য দুর্বল নকশা। কারণ: আপনি if-elseএটিকে স্বতন্ত্র বিবৃতিগুলির একটি সিরিজে রূপান্তর করেছেন - যা উদ্দেশ্যটি আড়াল করে, যা এগুলি পরস্পর-একচেটিয়া - কেবলমাত্র একটি actionকার্যকর করা হয়। পরিবর্তে আসতে bool, শরীরের সঙ্গে if (..) { action(); return true; } else return false;কলিং সাইটে তারপর উদ্দেশ্য দেখায়: if (MySwitchWithEnumerable(..)) else (MySwitchWithEnumerable(..));। এটি ভাল। তবে, এই সাধারণ ক্ষেত্রে এটি আপনার মূল সংস্করণের তুলনায় আর উল্লেখযোগ্য উন্নতি নয়।
টুলমেকারস্টেভ

15

এখানে সম্পূর্ণ সি # 7 সমাধান রয়েছে ...

switch (value)
{
   case var s when new[] { 1,2,3 }.Contains(s):
      // Do something
      break;
   case var s when new[] { 4,5,6 }.Contains(s):
      // Do something
      break;
   default:
      // Do the default
      break;
}

এটি স্ট্রিংগুলির সাথেও কাজ করে ...

switch (mystring)
{
   case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s):
      // Do something
      break;
...
}

এর অর্থ হ'ল আপনি প্রতিটি সুইচ স্টেটমেন্ট দিয়ে অ্যারেগুলি বরাদ্দ করেন, তাই না? আমাদের যদি ধ্রুবক ভেরিয়েবল হিসাবে থাকে তবে এটি কি ভাল হত না?
MaLiN2223

মার্জিত, তবে কম্পাইলার এই দৃশ্যটিকে অনুকূল করে কিনা তা জেনে রাখা ভাল so সময়ের আগে অ্যারেগুলি সংজ্ঞায়িত করা একটি বিকল্প, তবে কমনীয়তার অনেকটাই কেড়ে নেয়।
mklement0

11

নীচের কোডটি কাজ করবে না :

case 1 | 3 | 5:
// Not working do something

এটি করার একমাত্র উপায়:

case 1: case 2: case 3:
// Do something
break;

আপনি যে কোডটি ভিজুয়াল বেসিকের জন্য সন্ধান করছেন সেখানে আপনি সহজেই পরিসরগুলিতে রেঞ্জ রাখতে পারবেন ... স্টেটমেন্ট বা noneবিকল্প সুবিধামত ব্লকগুলির বিকল্পে , আমি খুব চূড়ান্ত পর্যায়ে, .dll তৈরি করার পরামর্শ দিচ্ছি এবং ফিরে আমদানি করব আপনার সি # প্রকল্পে।switchif else

দ্রষ্টব্য: ভিজ্যুয়াল বেসিকের স্যুইচ সমতুল্য Select Case


7

আরেকটি বিকল্প হ'ল একটি রুটিন ব্যবহার করা। যদি কেস- ১ 1-3- তে সমস্ত একই যুক্তি সম্পাদন করে তবে সেই যুক্তিটিকে একটি রুটিনে আবৃত করুন এবং প্রতিটি ক্ষেত্রে এটি কল করুন। আমি জানি এটি আসলে কেস স্টেটমেন্ট থেকে মুক্তি পাবে না, তবে এটি ভাল স্টাইল প্রয়োগ করে এবং ন্যূনতম রক্ষণাবেক্ষণ করে .....

[সম্পাদনা] মূল প্রশ্নের সাথে মেলে বিকল্প রূপায়ণ যুক্ত করা হয়েছে ... [/ সম্পাদনা]

switch (x)
{
   case 1:
      DoSomething();
      break;
   case 2:
      DoSomething();
      break;
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

অল্টার

switch (x)
{
   case 1:
   case 2:
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

5

সি # তে স্যুইচটির একটি কম পরিচিত দিকটি হ'ল এটি অপারেটরের উপর নির্ভর করে = এবং যেহেতু এটি অগ্রাহ্য করা যেতে পারে আপনার এ জাতীয় কিছু থাকতে পারে:


string s = foo();

switch (s) {
  case "abc": /*...*/ break;
  case "def": /*...*/ break;
}

4
কোডটি পড়ার চেষ্টা করা অন্য কারও পক্ষে এটি পরে আরও বড় ঘটনা হতে পারে
অ্যান্ড্রু হ্যারি

5

অনুক্রমিক রেঞ্জগুলি সমর্থন করতে জিসিসি সি ভাষায় একটি এক্সটেনশন প্রয়োগ করে:

switch (value)
{
   case 1...3:
      //Do Something
      break;
   case 4...6:
      //Do Something
      break;
   default:
      //Do the Default
      break;
}

সম্পাদনা : প্রশ্নের উপরে স্রেফ # ট্যাগটি লক্ষ্য করেছেন, সুতরাং সম্ভবত কোনও গিসি উত্তর সাহায্য করবে না।


4

সি # 7 তে আমাদের এখন প্যাটার্ন ম্যাচিং রয়েছে যাতে আপনি এর মতো কিছু করতে পারেন:

switch (age)
{
  case 50:
    ageBlock = "the big five-oh";
    break;
  case var testAge when (new List<int>()
      { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Contains(testAge):
    ageBlock = "octogenarian";
    break;
  case var testAge when ((testAge >= 90) & (testAge <= 99)):
    ageBlock = "nonagenarian";
    break;
  case var testAge when (testAge >= 100):
    ageBlock = "centenarian";
    break;
  default:
    ageBlock = "just old";
    break;
}

3

আসলে আমি গোটো কমান্ডটি পছন্দ করি না তবে এটি সরকারী মাইক্রোসফ্ট উপকরণগুলিতে রয়েছে এবং এখানে সমস্ত অনুমোদিত সিনট্যাক্স রয়েছে ax

যদি একটি স্যুইচ বিভাগের বিবৃতি তালিকার শেষ পয়েন্টটি পৌঁছানো যায়, একটি সংকলন-সময় ত্রুটি ঘটে। এটি "না পড়েই" নিয়ম হিসাবে পরিচিত। উদাহরণ

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
default:
   CaseOthers();
   break;
}

বৈধ কারণ কোনও সুইচ বিভাগে পৌঁছনীয় সমাপ্তি বিন্দু নেই। সি এবং সি ++ এর বিপরীতে, একটি স্যুইচ বিভাগ কার্যকর করার জন্য পরবর্তী সুইচ বিভাগটিতে "মধ্য দিয়ে পড়ার" অনুমতি নেই এবং উদাহরণ

switch (i) {
case 0:
   CaseZero();
case 1:
   CaseZeroOrOne();
default:
   CaseAny();
}

একটি সংকলন সময় ত্রুটি ফলাফল। যখন অন্য একটি স্যুইচ বিভাগ কার্যকর করার পরে একটি স্যুইচ বিভাগ কার্যকর করা হয়, তখন একটি স্পষ্ট গোটো কেস বা গোটো ডিফল্ট বিবৃতি অবশ্যই ব্যবহার করা উচিত:

switch (i) {
case 0:
   CaseZero();
   goto case 1;
case 1:
   CaseZeroOrOne();
   goto default;
default:
   CaseAny();
   break;
}

একাধিক লেবেলকে একটি স্যুইচ-বিভাগে অনুমোদিত। উদাহরণ

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
case 2:
default:
   CaseTwo();
   break;
}

আমি এই বিশেষ ক্ষেত্রে বিশ্বাস করি, গোটো ব্যবহার করা যেতে পারে, এবং এটি আসলে পতনের একমাত্র উপায়।

সূত্র: http://msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx


নোট করুন যে বাস্তবে, gotoপ্রায় সর্বদা এড়ানো যায় (যদিও আমি এটিকে এখানে "ভয়ঙ্কর" মনে করি না - এটি একটি নির্দিষ্ট, কাঠামোগত, ভূমিকা পূরণ করছে)। আপনার উদাহরণস্বরূপ, আপনি কেস বডিগুলি ফাংশনে আবদ্ধ করেছেন (একটি ভাল জিনিস), কেস 0 হতে পারে CaseZero(); CaseZeroOrOne(); break;। কোন gotoপ্রয়োজন নেই ।
টুলমেকারস্টেভ

লিঙ্কটি অর্ধ-ভাঙ্গা (পুনর্নির্দেশ, "ভিজ্যুয়াল স্টুডিও 2003 অবসরপ্রাপ্ত প্রযুক্তিগত ডকুমেন্টেশন" )।
পিটার মর্টেনসেন

2

একটি ভয়ঙ্কর কাজ মনে হচ্ছে যে কোনওরকম সি # এর কমপক্ষে ব্যবহৃত সিনট্যাক্সগুলি কোনওরকমভাবে আরও ভাল দেখায় বা আরও ভাল কাজ করতে পারে তার উপায়গুলি সন্ধান করার জন্য এটি অন্তর্ভুক্ত করা হয়েছে। ব্যক্তিগতভাবে আমি স্যুইচ স্টেটমেন্টটি ব্যবহার করা খুব কমই খুঁজে পাই। আপনি কোন ডেটা পরীক্ষা করছেন এবং শেষ ফলাফল আপনি চান তা বিশ্লেষণ করার জন্য আমি দৃ strongly়তার সাথে পরামর্শ দেব।

আসুন আমরা উদাহরণস্বরূপ বলি যে আপনি একটি প্রাথমিক পরিসরে মানগুলি প্রাথমিক মানের কিনা তাড়াতাড়ি পরীক্ষা করতে চান। আপনি আপনার কোডটি অপব্যয়যুক্ত গণনা না করে এড়াতে চান এবং আপনি অনলাইনে চান এমন পরিসরটিতে প্রাইমগুলির একটি তালিকা পেতে পারেন। প্রতিটি মানকে জ্ঞাত মূল সংখ্যার সাথে তুলনা করতে আপনি একটি বিশাল স্যুইচ স্টেটমেন্ট ব্যবহার করতে পারেন।

অথবা আপনি কেবল প্রাইমের একটি অ্যারে মানচিত্র তৈরি করতে এবং তাত্ক্ষণিক ফলাফল পেতে পারেন:

    bool[] Primes = new bool[] {
        false, false, true, true, false, true, false,    
        true, false, false, false, true, false, true,
        false,false,false,true,false,true,false};
    private void button1_Click(object sender, EventArgs e) {
        int Value = Convert.ToInt32(textBox1.Text);
        if ((Value >= 0) && (Value < Primes.Length)) {
            bool IsPrime = Primes[Value];
            textBox2.Text = IsPrime.ToString();
        }
    }

স্ট্রিংয়ের কোনও অক্ষর হেক্সাডেসিমাল কিনা তা আপনি দেখতে চাইতে পারেন। আপনি একটি কুরুচিপূর্ণ এবং কিছুটা বড় স্যুইচ স্টেটমেন্ট ব্যবহার করতে পারেন।

অথবা আপনি চরটি পরীক্ষা করতে নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন বা পরিচিত হেক্সাডেসিমাল অক্ষরের একটি স্ট্রিংয়ে চরটি অনুসন্ধান করতে সূচিপত্র ফাংশনটি ব্যবহার করতে পারেন:

        private void textBox2_TextChanged(object sender, EventArgs e) {
        try {
            textBox1.Text = ("0123456789ABCDEFGabcdefg".IndexOf(textBox2.Text[0]) >= 0).ToString();
        } catch {
        }
    }

আমাদের বলুন যে আপনি 1 থেকে 24 এর সীমা হতে হবে এমন কোনও মানের উপর নির্ভর করে 3 টি পৃথক ক্রিয়াকলাপের মধ্যে একটি করতে চান I এবং যদি এটি খুব জটিল হয়ে ওঠে (বা সংখ্যাগুলি বৃহত্তর ছিল যেমন 1 থেকে 90 এর সীমার মানের উপর নির্ভর করে 5 টি পৃথক ক্রিয়া) তবে ক্রিয়াগুলি সংজ্ঞায়িত করতে এবং এনামগুলির একটি অ্যারে মানচিত্র তৈরি করতে একটি এনাম ব্যবহার করুন। মানটি তখন অ্যারে মানচিত্রে সূচকে ব্যবহৃত হবে এবং আপনি যে ক্রিয়াটি চান তা গ্রহণ করবে। তারপরে ফলস্বরূপ এনাম মানটি প্রক্রিয়াকরণের জন্য আইএফ স্টেটমেন্টগুলির একটি ছোট সেট বা খুব সাধারণ স্যুইচ স্টেটমেন্ট ব্যবহার করুন।

এছাড়াও, অ্যারের মানচিত্রের দুর্দান্ত জিনিস যা বিভিন্ন মানকে ক্রিয়ায় রূপান্তর করে তা হ'ল কোড দ্বারা সহজেই পরিবর্তন করা যায়। হার্ড ওয়্যার্ড কোড সহ আপনি রানটাইমে সহজেই আচরণ পরিবর্তন করতে পারবেন না তবে অ্যারের মানচিত্রের সাহায্যে এটি সহজ।


আপনি ল্যাম্বডা এক্সপ্রেশন বা কোনও প্রতিনিধিকেও মানচিত্র করতে পারেন
কনরাড ফ্রিক্স

ভাল দিক. একটি ছোট্ট মন্তব্য: আমি সাধারণত একটি অ্যারে মানচিত্রের চেয়ে প্রদত্ত কেসের সাথে মানগুলির মানগুলির তালিকা বজায় রাখা সহজ মনে করি। অ্যারে মানচিত্রে সমস্যা হ'ল ভুল করা সহজ। উদাহরণস্বরূপ, সত্য / ফলসগুলির প্রাইম অ্যারের মানচিত্রের পরিবর্তে প্রাইমগুলির একটি তালিকা রয়েছে, এবং এগুলি অনুসন্ধানের জন্য হ্যাশসেটে লোড করুন। এমনকি যদি দুটিরও বেশি মামলা থাকে তবে সাধারণত একটি ক্ষেত্রে একটি ছোট তালিকা থাকে, সুতরাং অন্যান্য মামলার তালিকা থেকে কোডগুলিতে এনামগুলির একটি হ্যাশসেট (যদি কম থাকে) বা কোনও অ্যারে মানচিত্র তৈরি করুন।
টুলমেকারস্টেভ

1

NET 4.6.2 ব্যবহার করে কেবল কথোপকথনে যোগ করতে আমি নিম্নলিখিতটি করতে সক্ষম হয়েছি। আমি কোডটি পরীক্ষা করেছি এবং এটি আমার পক্ষে কাজ করেছে।

আপনি নীচের মত একাধিক "OR" বিবৃতিও করতে পারেন:

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when b.Contains("text3") || b.Contains("text4") || b.Contains("text5"):
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

এটি কোনও অ্যারের সাথে কোনও মানের সাথে মেলে কিনা তাও আপনি পরীক্ষা করতে পারেন:

            string[] statuses = { "text3", "text4", "text5"};

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when statuses.Contains(value):                        
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

এটি কি সি # সংস্করণের উপর নির্ভর করে না। নেট সংস্করণে নয়?
পিটার মর্টেনসেন

1

আপনার যদি খুব বড় পরিমাণে স্ট্রিং (বা অন্য কোনও ধরণের) কেস থাকে যা একই জিনিস করে থাকে তবে আমি স্ট্রিংয়ের সাথে মিলিত একটি স্ট্রিং তালিকা ব্যবহারের পরামর্শ দিচ্ছি ont সম্পত্তি যুক্ত করে।

সুতরাং আপনার যদি একটি বড় সুইচ বিবৃতি থাকে:

switch (stringValue)
{
    case "cat":
    case "dog":
    case "string3":
    ...
    case "+1000 more string": // Too many string to write a case for all!
        // Do something;
    case "a lonely case"
        // Do something else;
    .
    .
    .
}

আপনি এটি একটি ifবিবৃতি দিয়ে এটি প্রতিস্থাপন করতে পারেন :

// Define all the similar "case" string in a List
List<string> listString = new List<string>(){ "cat", "dog", "string3", "+1000 more string"};
// Use string.Contains to find what you are looking for
if (listString.Contains(stringValue))
{
    // Do something;
}
else
{
    // Then go back to a switch statement inside the else for the remaining cases if you really need to
}

যে কোনও সংখ্যক স্ট্রিংয়ের ক্ষেত্রে এই স্কেলটি ভাল।


0

আমি মনে করি এটি # 7 বা তারও বেশি উপরে।

switch (value)
{
    case var s when new[] { 1,2 }.Contains(s):
    // Do something
     break;

    default:
    // Do the default
    break;
 }

আপনি সি # স্যুইচ ক্ষেত্রেও রেঞ্জটি পরীক্ষা করতে পারেন: স্যুইচ কেস: আমি কি কোনও একটি সংখ্যার পরিবর্তে একটি ব্যাপ্তি ব্যবহার করতে পারি বা আপনি যদি সি # সুইচ কেসের মূল বিষয়গুলি বুঝতে চান


-5

এর জন্য, আপনি একটি গোটো স্টেটমেন্ট ব্যবহার করবেন। যেমন:

    switch(value){
    case 1:
        goto case 3;
    case 2:
        goto case 3;
    case 3:
        DoCase123();
    //This would work too, but I'm not sure if it's slower
    case 4:
        goto case 5;
    case 5:
        goto case 6;
    case 6:
        goto case 7;
    case 7:
        DoCase4567();
    }

7
@ স্কোন গোটো পদ্ধতিগত প্রোগ্রামিংয়ের একটি মৌলিক প্রিন্সিপালকে ভেঙে ফেলেছে (যার মধ্যে সি ++ এবং সি # এখনও মূলযুক্ত; তারা খাঁটি ওও ভাষা নয় (thankশ্বরের ধন্যবাদ))। কার্যনির্বাহী প্রোগ্রামিংয়ে ভাষা নির্মান এবং পদ্ধতি কলিং কনভেনশন (রানটাইম স্ট্যাকটি কীভাবে বৃদ্ধি পায় এবং সঙ্কুচিত হয়) দ্বারা নির্ধারিত যুক্তির একটি ভাল সংজ্ঞায়িত প্রবাহ রয়েছে। গোটো স্টেটমেন্টটি মূলত স্বতঃস্ফূর্তভাবে ঝাঁপিয়ে পড়ার অনুমতি দিয়ে এই প্রবাহকে বাধা দেয়।
সমিস

1
আমি বলছি না এটি ভাল স্টাইল, স্থির থাকা, তবে এটি মূল প্রশ্নটি যা জিজ্ঞাসা করেছিল তা করে।
স্ক্যান

2
না, এটি "মূল প্রশ্নটি যা চেয়েছিল তা করে না"। মূল প্রশ্নের কোড ছিল যা কাজ করেছে । তাদের এটি ঠিক করার দরকার নেই। এমনকি যদি তারা তা করে তবে এটি একটি ভয়াবহ পরামর্শ। এর কম সংক্ষিপ্ত, এবং ব্যবহার করে goto। সবচেয়ে খারাপ, এটি সম্পূর্ণরূপে অপ্রয়োজনীয় ব্যবহার goto, যেমন ওপি দ্বারা বর্ণিত মূল বাক্য গঠন কাজ করে। বিকল্প কেস দেওয়ার আরও সংক্ষিপ্ত উপায় ছিল কিনা তা নিয়ে প্রশ্ন ছিল । লোকেরা যেমনটি করার আগে বছরগুলি উত্তর দিয়েছিল , হ্যাঁ সেখানে আছে - আপনি যদি একাধিক কেস এক লাইনে রাখতে ইচ্ছুক হন case 1: case 2:, এবং যদি সম্পাদকের স্ব-শৈলীর অনুমতি দেয়।
টুলমেকারস্টেভ

গোটোগুলি খারাপ হওয়ার জন্য দৃ determined়সংকল্পবদ্ধ হওয়ার একমাত্র কারণ হ'ল কিছু লোককে যুক্তিযুক্ত প্রবাহ অনুসরণ করা কঠিন মনে হয়। । নেট এমএসআইএল (একত্রিত অবজেক্ট কোড) গোটা ব্যবহার করে কারণ এটি দ্রুত, তবে যদি নেট কোডটি রচনা করা যায় এবং এগুলি ছাড়া ঠিক পারফরম্যান্ট হতে পারে তবে সেগুলি ব্যবহার না করাই ভাল এবং যাতে আপনি @ এর মতো লোকেরা ভীত হন না @ সরঞ্জাম প্রস্তুতকারকের স্ট্যান্ডির উত্তম উত্তর।
ডায়নামিক্লিংক

@ ওয়াচওয়ার্ড - দয়া করে আমার উত্তরটি আরও মনোযোগ সহকারে পড়ুন। আমার অভিযোগ শুধু গোটো ব্যবহার সম্পর্কে নয় । আমি আপত্তি জানিয়েছিলাম কারণ প্রশ্নটি ইতিমধ্যে যেমনটি কাজ করে এমন কোডটি দেখিয়েছিল এবং এ উত্তর ক) এই কার্যকরী কোডটি গ্রহণ করে এবং এটি আরও কার্যকরী করে তোলে, এবং কম সু-কাঠামোগত, কোনও লাভের জন্য খ) প্রশ্নের উত্তর দেয় না।
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.