2010-05-20 10 views
12

Si potrebbe pensare che ci sarebbe un modo utilizzando DirectCast, TryCast, CType ecc ma tutti sembrano soffocare su di esso per esempio:Può .NET convertire "Sì" e "No" in booleano senza Se?

CType("Yes", Boolean) 

Si ottiene:

System.InvalidCastException - Conversione dalla stringa "Sì" al tipo "booleano" non è valido.

+1

con switch-case;) – Stefan

+0

creare sei proprio struct :-) – philhobgen

+0

usare l'operatore ternario: p – kennytm

risposta

55

Se ci pensate, "sì" non può essere convertito in bool perché è una stringa specifica lingua e contesto.

"Sì" non è sinonimo di vero (soprattutto quando tua moglie lo dice ...!). Per cose del genere è necessario convertirlo da soli; "Sì" significa "vera", "mmmm yeeessss" significa "una mezza verità, la metà falso, forse", ecc

+16

+1 per la moglie e il resto – Jehof

+0

+1 per il commento della moglie –

+23

Vuol dire che ci manca un tipo di dati importante WifeBoolean :) –

5

No, ma si potrebbe fare come:

bool yes = "Yes".equals(yourString);

+0

Genio, semplicemente geniale! –

2
private static bool GetBool(string condition) 
{ 
    return condition.ToLower() == "yes"; 
} 

GetBool("Yes"); // true 
GetBool("No"); // false 

O un altro approccio che utilizzano metodi di estensione

public static bool ToBoolean(this string str) 
{ 
    return str.ToLower() == "yes"; 
} 

bool answer = "Yes".ToBoolean(); // true 
bool answer = "AnythingOtherThanYes".ToBoolean(); // false 
+1

Fai attenzione all'involucro del tuo input.Forse usare 'return (condition.ToUpper() ==" YES ")? vero: falso; 'invece – ZombieSheep

+0

Hai ragione! +1 – sshow

+1

Aggiungi altro Zen booleano al tuo codice: return condition.ToLower() == "yes" – bniwredyc

19

Utilizzando questo modo, puoi definire le conversioni da qualsiasi stringa che ti piace, al valore booleano di cui hai bisogno. 1 è vero, 0 è falso, ovviamente.
Vantaggi: facilmente modificabile. Puoi aggiungere nuovi alias o rimuoverli molto facilmente.
Contro: Probabilmente ci vorrà più di un semplice se. (Ma se si dispone di più alises, otterrà pelosa)

enum BooleanAliases { 
     Yes = 1, 
     Aye = 1, 
     Cool = 1, 
     Naw = 0, 
     No = 0 
} 
static bool FromString(string str) { 
     return Convert.ToBoolean(Enum.Parse(typeof(BooleanAliases), str)); 
} 
// FromString("Yes") = true 
// FromString("No") = false 
// FromString("Cool") = true 
+0

Se lo vuoi culturalmente portabile, puoi anche solo avere un dizionario con alcuni valori, in modo che tu possa impostarlo in runtime. – Rubys

+1

+1, intelligente, facile da leggere, manutenibile. – AMissico

+0

LOL, mi piace questa idea eccessivamente ingegnerizzata. – Gqqnbig

1

Leggermente fuori tema, ma avevo bisogno di una volta per uno dei miei corsi per visualizzare 'Si/No' invece di 'Vero/Falso 'in una griglia di proprietà, quindi ho implementato YesNoBooleanConverter derivato da BooleanConverter e decorando la mia proprietà con <TypeConverter(GetType(YesNoBooleanConverter))> _ ...

1

Non è possibile. Ma si dovrebbe usarlo come

bool result = yourstring.ToLower() == "yes"; 
-2
Public Function TrueFalseToYesNo(thisValue As Boolean) As String 
    Try 
     If thisValue Then 
      Return "Yes" 
     Else 
      Return "No" 
     End If 
    Catch ex As Exception 
     Return thisValue.ToString 
    End Try 
End Function 
+2

La domanda è chiedere come convertire '" Sì "'/'" No "' a 'true' /' false', non viceversa. – Pang

Problemi correlati