2010-09-15 12 views
18

बस स्वच्छता के लिए मैं सोच रहा था, क्या वाई या एन को बूल में डालना संभव है? कुछ इस तरह;कास्टिंग वाई या एन को बूल सी #

bool theanswer = Convert.ToBoolean(input); 

लंबा संस्करण;

bool theanswer = false; 
switch (input) 
{ 
    case "y": theanswer = true; break; 
    case "n": theanswer = false; break 
} 
+2

क्या स्ट्रिंग "y" या "n" नहीं है, तो क्या आप एल्गोरिदम को बम करना चाहते हैं? –

+0

मैं अपवाद को पकड़ने की कोशिश कर रहा था। – wonea

+3

इसके लिए कोई समर्थन नहीं है। मुझे लगता है कि यह y/n होने के कारण _localized_ जानकारी (हां/नहीं) है जो वर्तमान संस्कृति पर निर्भर करता है। – sisve

उत्तर

41

नहीं, इसके लिए कुछ भी नहीं बनाया गया है।

हालांकि, यह देखते हुए कि आप गलत पर डिफ़ॉल्ट करना चाहते हैं, तो आप सिर्फ उपयोग कर सकते हैं:

bool theAnswer = (input == "y"); 

(bracketing वहाँ स्पष्टता के लिए बस है।)

आप बनाने पर विचार करने के लिए यह केस चाहते हो सकता है हालांकि असंवेदनशील, आपके प्रश्न के पाठ और आपके पास प्राप्त कोड के बीच अंतर दिया गया है। ऐसा करने का एक तरीका यह:

bool theAnswer = "y".Equals(input, StringComparison.OrdinalIgnoreCase); 

ध्यान दें कि निर्दिष्ट स्ट्रिंग तुलना उपयोग कर एक नया स्ट्रिंग बनाने से बचा जाता है, और आप सांस्कृतिक मुद्दों के बारे में चिंता करने की जरूरत नहीं है ... जब तक आप एक संस्कृति प्रदर्शन करने के लिएचाहते का मतलब निश्चित रूप से संवेदनशील तुलना। यह भी ध्यान दें कि inputnull है जब मैंने NullReferenceException को फेंकने से बचने के लिए विधि कॉल के "लक्ष्य" के रूप में शाब्दिक रखा है।

+9

दूसरे उदाहरण में शून्य के इनपुट के खिलाफ अच्छा गार्ड। उसे याद रखना होगा। – Luc

+0

इसके लिए धन्यवाद, स्पष्टीकरण वास्तव में मदद की। – wonea

+2

(इनपुट ?? "") .क्वल्स ("वाई", स्ट्रिंग कॉम्पर्सन। ऑर्डिनल इग्नोरकेस); इरादा स्पष्ट करता है, हम कुछ स्थिरांक के बराबर चर के मान की जांच नहीं करते हैं। यदि यह (सीयूएल == पीआरटी) –

8
bool theanswer = input.ToLower() == "y"; 
+0

का उपयोग कर रहा है तो इसका एक ही सी ++ बहस है। तारों की तुलना करते समय .लोवर को खराब अभ्यास माना जाता है। बराबर फ़ंक्शन का बेहतर उपयोग करें। आपकी विधि काम कर सकती है, लेकिन बराबर बेहतर है। इसके अलावा आपका कोड iput को शून्य से संभाल नहीं करता है (इनपुट शून्य होने पर ToLower पर एक nullpointer का कारण बनता है)। – Gertjan

+0

शानदार सामान, धन्यवाद। मैं इस तरह के अभिव्यक्तियों को बनाने के तरीके में और अधिक पढ़ना चाहता हूं। – wonea

+1

@Gertjan - कृपया कंबल स्टेटमेंट बनाने के बजाय सर्वोत्तम प्रथाओं पर विचार करने के लिए एक लिंक प्रदान करें। आवेदन की ज़रूरतों के आधार पर, मुझे लगता है कि स्तर पर एक NullReferenceException की अपेक्षा की जाएगी जैसे कि इसे एक टुकड़ा निष्पादित किया जाएगा। –

4

इस बारे में कैसे।

bool theanswer = input.Equals("Y", StringComparison.OrdinalIgnoreCase); 

या फिर भी सुरक्षित संस्करण।

bool theanswer = "Y".Equals(input, StringComparison.OrdinalIgnoreCase); 
+1

यदि इनपुट शून्य है तो यह आपको एक त्रुटि देगा। बेहतर "वाई" पर बराबर का उपयोग करें क्योंकि यह शून्य नहीं हो सकता है। – Gertjan

+0

मैं आपसे सहमत हूं। –

5

कि क्या आप दूसरी एल्गोरिथ्म में निर्दिष्ट करने के लिए कुछ ऐसा ही स्ट्रिंग के लिए एक विस्तार पद्धति बनाएं, इस प्रकार आपके कोड को साफ:

public static bool ToBool(this string input) 
{ 
    // input will never be null, as you cannot call a method on a null object 
    if (input.Equals("y", StringComparison.OrdinalIgnoreCase)) 
    { 
     return true; 
    } 
    else if (input.Equals("n", StringComparison.OrdinalIgnoreCase)) 
    { 
     return false; 
    } 
    else 
    { 
     throw new Exception("The data is not in the correct format."); 
    } 
} 

और कॉल कोड:

if (aString.ToBool()) 
{ 
    // do something 
} 
+1

विस्तार विधि का अच्छा उपयोग, लेकिन शायद बूलियन वर्ग (Int.Parse की तरह) पर एक पार्स बनाना बेहतर है। – Gertjan

+1

आप किसी वर्ग का विस्तार नहीं कर सकते हैं जिसमें आपके पास example..in का कोई उदाहरण नहीं हो सकता है, आपके पास स्थिर वर्ग का विस्तार नहीं हो सकता है। –

+0

बराबर के बजाए स्टार्ट्सविथ का उपयोग करने का कोई कारण? मैं बात "बहुत ज्यादा नहीं" शायद "सत्य" के रूप में अमान्य है :) (मैं अपने उत्तर के अनुसार स्ट्रिंग कॉम्पर्सन का उपयोग करने की भी सिफारिश करता हूं।यदि आप * इनपुट '.Lower() 'का उपयोग करने जा रहे हैं, तो मैं कम से कम इसे केवल एक बार कॉल करूंगा।) –

0

या यह?

bool CastToBoolean(string input) 
{ 
    return input.Equals("Y", StringComparison.OrdinalIgnoreCase); 
} 
5

जैसा कि जॉन द्वारा सुझाया गया है, इस तरह कुछ भी अंतर्निहित नहीं है। जॉन द्वारा पोस्ट किया गया जवाब आपको करने का सही तरीका देता है। बस और अधिक स्पष्टीकरण के लिए, आप यात्रा कर सकते हैं:

http://msdn.microsoft.com/en-us/library/86hw82a3.aspxlink text

-1
class Program 
{ 
    void StringInput(string str) 
    { 
     string[] st1 = str.Split(' '); 

     if (st1 != null) 
     { 
      string a = str.Substring(0, 1); 
      string b=str.Substring(str.Length-1,1); 

      if(
       a=="^" && b=="^" 
       || a=="{" && b=="}" 
       || a=="[" && b=="]" 
       ||a=="<" && b==">" 
       ||a=="(" && b==")" 
       ) 

      { 
       Console.Write("ok Formate correct"); 
      } 
      else 
      { 
       Console.Write("Sorry incorrect formate..."); 
      } 
     } 
    } 
    static void Main(string[] args) 
    { 
     ubaid: ; 
     Program one = new Program(); 
     Console.Write("For exit Press N "); 
     Console.Write("\n"); 
     Console.Write("Enter your value...="); 
     string ub = Console.ReadLine(); 

     if (ub == "Y" || ub=="y" || ub=="N" || ub=="n") 
     { 
      Console.Write("Are your want to Exit Y/N: "); 
      string ui = Console.ReadLine(); 
      if (ui == "Y" || ui=="y") 
      { 
       return; 
      } 
      else 
      { 
       goto ubaid; 
      } 

     } 
     one.StringInput(ub);   
     Console.ReadLine(); 
     goto ubaid; 
    } 
} 
+0

मेरा विचार कुछ छोटा और संक्षिप्त बनाना था, यह कोड बहुत अधिक है। – wonea

0

मैं एक ही समस्या का सामना करना पड़ा लेकिन अन्य तरीके से हल किया।

bool b=true; 
     decimal dec; 
     string CurLine = "";   
     CurLine = sr.ReadLine(); 
     string[] splitArray = CurLine.Split(new Char[] { '=' }); 
     splitArray[1] = splitArray[1].Trim(); 
     if (splitArray[1].Equals("Y") || splitArray[1].Equals("y")) b = true; else b = false; 
     CurChADetails.DesignedProfileRawDataDsty1.Commen.IsPad = b; 
0

DotNetPerls विभिन्न स्ट्रिंग bools पार्स करने के लिए एक आसान वर्ग है।

/// <summary> 
/// Parse strings into true or false bools using relaxed parsing rules 
/// </summary> 
public static class BoolParser 
{ 
    /// <summary> 
    /// Get the boolean value for this string 
    /// </summary> 
    public static bool GetValue(string value) 
    { 
     return IsTrue(value); 
    } 

    /// <summary> 
    /// Determine whether the string is not True 
    /// </summary> 
    public static bool IsFalse(string value) 
    { 
     return !IsTrue(value); 
    } 

    /// <summary> 
    /// Determine whether the string is equal to True 
    /// </summary> 
    public static bool IsTrue(string value) 
    { 
     try 
     { 
      // 1 
      // Avoid exceptions 
      if (value == null) 
      { 
       return false; 
      } 

      // 2 
      // Remove whitespace from string 
      value = value.Trim(); 

      // 3 
      // Lowercase the string 
      value = value.ToLower(); 

      // 4 
      // Check for word true 
      if (value == "true") 
      { 
       return true; 
      } 

      // 5 
      // Check for letter true 
      if (value == "t") 
      { 
       return true; 
      } 

      // 6 
      // Check for one 
      if (value == "1") 
      { 
       return true; 
      } 

      // 7 
      // Check for word yes 
      if (value == "yes") 
      { 
       return true; 
      } 

      // 8 
      // Check for letter yes 
      if (value == "y") 
      { 
       return true; 
      } 

      // 9 
      // It is false 
      return false; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 

द्वारा कॉल किया जाता है;

BoolParser.GetValue("true") 
BoolParser.GetValue("1") 
BoolParser.GetValue("0") 

यह किसी ऑब्जेक्ट को स्वीकार करने के लिए पैरामीटर ओवरलोड जोड़कर और भी बेहतर हो सकता है।

public static bool IsTrue(string value) 
{ 
    // Avoid exceptions 
    if (value == null) 
     return false; 

    // Remove whitespace from string and lowercase it. 
    value = value.Trim().ToLower(); 

    return value == "true" 
     || value == "t" 
     || value == "1" 
     || value == "yes" 
     || value == "y"; 
} 

या::

private static readonly IReadOnlyCollection<string> LOWER_TRUE_VALUES = new string[] { "true", "t", "1", "yes", "y" }; 

public static bool IsTrue(string value) 
{ 
    return value != null 
     ? LOWER_TRUE_VALUES.Contains(value.Trim().ToLower()) 
     : false; 
} 

ओह, आप वास्तविक कम (और बदसूरत) प्राप्त करने के लिए चाहते हैं, तो आपको लगता है कि नीचे दो को संक्षिप्त कर सकते हैं

+0

मेरा मानना ​​है कि दो स्थैतिक विधियों को इस प्रकार विस्तार विधियां माना जाना चाहिए: सार्वजनिक स्थैतिक बूल GetValue (** यह ** स्ट्रिंग मान) => IsTrue (मान); सार्वजनिक स्थैतिक बूल IsFalse (** यह ** स्ट्रिंग मान) =>! IsTrue (मान); –

0

Wonea gave an "IsTrue" source example from DotNetPerls. यहाँ यह के दो छोटे संस्करण हैं इस तरह की रेखाएं:

private static readonly IReadOnlyCollection<string> LOWER_TRUE_VALUES = new string[] { "true", "t", "1", "yes", "y" }; 
public static bool IsTrue(string value) => value != null ? LOWER_TRUE_VALUES.Contains(value.Trim().ToLower()) : false; 
संबंधित मुद्दे