2010-09-15 29 views
18

Chỉ cần cho gọn gàng vì tôi đã tự hỏi, cho dù nó có thể đúc Y hoặc N để một bool? Một cái gì đó như thế này;Đúc Y hoặc N để bool C#

bool theanswer = Convert.ToBoolean(input); 

Phiên bản dài;

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

Bạn có muốn thuật toán đánh bom nếu chuỗi không phải là "y" hoặc "n" không? –

+0

Tôi đang cân nhắc việc cố gắng loại trừ ngoại lệ. – wonea

+3

Không có hỗ trợ cho việc này. Tôi cho rằng điều này là do y/n là thông tin _localized_ (có/không) phụ thuộc vào văn hóa hiện tại. – sisve

Trả lời

41

Không, không có gì tích hợp cho việc này.

Tuy nhiên, cho rằng bạn muốn để mặc định là false, bạn chỉ có thể sử dụng:

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

(Các bracketing có chỉ là cho rõ ràng.)

Bạn có thể muốn xem xét làm cho nó đựng pin- không nhạy cảm, cho sự khác biệt giữa văn bản câu hỏi của bạn và mã bạn đã có. Một cách để làm điều này:

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

Lưu ý rằng việc sử dụng sự so sánh chuỗi định tránh việc tạo ra một chuỗi mới, và có nghĩa là bạn không cần phải lo lắng về các vấn đề văn hóa ... trừ khi bạn muốn để thực hiện một nền văn hóa so sánh nhạy cảm, tất nhiên. Cũng lưu ý rằng tôi đã đặt chữ "đích" của phương thức gọi để tránh NullReferenceException bị ném khi inputnull.

+9

Bảo vệ tuyệt đối chống lại đầu vào là null trong ví dụ thứ hai. Phải nhớ điều đó. – Luc

+0

Cảm ơn vì điều đó, lời giải thích thực sự hữu ích. – wonea

+2

(đầu vào ?? "") .Equals ("y", StringComparison.OrdinalIgnoreCase); làm cho ý định rõ ràng, chúng tôi kiểm tra giá trị của các biến bằng một số hằng số không ngược lại. Nó cùng một cuộc tranh luận C++ nếu (NULL == ptr) –

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

Sử dụng. ToLower được coi là thực hành không tốt khi so sánh chuỗi. Sử dụng tốt hơn hàm equals. Phương pháp của bạn có thể hoạt động, nhưng bằng tốt hơn. Ngoài ra mã của bạn không xử lý iput là null (gây ra một nullpointer trên ToLower khi đầu vào là null). – Gertjan

+0

Công cụ tuyệt vời, cảm ơn bạn. Tôi muốn đọc to hơn về cách hình thành các loại biểu thức này. – wonea

+1

@Gertjan - Vui lòng cung cấp liên kết để xem xét các phương pháp hay nhất thay vì đưa ra tuyên bố về chăn. Tùy thuộc vào nhu cầu của ứng dụng, tôi sẽ nghĩ rằng một NullReferenceException sẽ được dự kiến ​​ở mức một mảnh như thế này sẽ được thực hiện. –

4

làm thế nào về điều này.

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

hoặc phiên bản an toàn hơn.

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

Nếu đầu vào là null, nó sẽ cho bạn một lỗi. Sử dụng tốt hơn các giá trị bằng "y" vì nó không thể là giá trị rỗng. – Gertjan

+0

Tôi đồng ý với bạn. –

5

Tạo một phương pháp mở rộng cho chuỗi mà làm điều gì đó tương tự như những gì bạn chỉ định trong các thuật toán thứ hai, do đó dọn dẹp mã của bạn:

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."); 
    } 
} 

và gọi mã:

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

Sử dụng tốt phương pháp mở rộng, nhưng có lẽ tốt hơn là nên phân tích cú pháp trên lớp boolean (như Int.Parse). – Gertjan

+1

Bạn không thể thực hiện một phần mở rộng của một lớp mà bạn không thể có một thể hiện của..in các từ khác, bạn không thể có một phần mở rộng cho một lớp tĩnh. –

+0

Bất kỳ lý do nào để sử dụng StartsWith thay vì bằng? Tôi điều "không phải rất nhiều" có lẽ chỉ là không hợp lệ như "true" :) (Tôi cũng khuyên bạn nên sử dụng StringComparison, theo câu trả lời của tôi.Nếu bạn * sẽ * sử dụng 'input.ToLower()', tôi sẽ ít nhất chỉ gọi nó là một lần.) –

0

Hoặc điều này?

bool CastToBoolean(string input) 
{ 
    return input.Equals("Y", StringComparison.OrdinalIgnoreCase); 
} 
-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

Ý tưởng của tôi là tạo ra một cái gì đó nhỏ và súc tích, mã này là quá nhiều. – wonea

0

tôi phải đối mặt với cùng một vấn đề nhưng giải quyết cách nào khác.

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 có một lớp tiện dụng cho phân tích bools chuỗi khác nhau.

/// <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; 
     } 
    } 
} 

Được gọi bằng;

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

Điều này có thể được cải thiện thêm bằng cách thêm quá tải tham số để chấp nhận đối tượng.

+0

Tôi tin rằng hai phương pháp tĩnh có nghĩa vụ phải là các phương pháp mở rộng như thế này: công thức tĩnh bool GetValue (** this ** string value) => IsTrue (giá trị); public static bool IsFalse (** giá trị chuỗi ** này) =>! IsTrue (giá trị); –

0

Wonea gave an "IsTrue" source example from DotNetPerls. Dưới đây là hai phiên bản ngắn hơn của nó:

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"; 
} 

OR:

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; 
} 

Heck, nếu bạn muốn nhận được thật ngắn (và xấu xí), bạn có thể sụp đổ mà xuống hai các dòng như sau:

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; 
Các vấn đề liên quan