Waarom is besloten dat bij het ontleden van een boolean, 0/1 niet acceptabel is?
Bij het ontleden van een waarde van het type geheel getal, accepteert het numerieke tekenreeksen die moeten worden geparseerd. (En als .NET de string “Honderd miljoen tweehonderdvijfenzestigduizend achthonderdvijfenzestig” kan ontleden, zou ik verbaasd zijn).
Wat maakt booleans speciaal? Ze zijn in wezen 0 als onwaar, en niet-nul als waar in mijn ervaring…
Is er een bcl-methode om een string als deze te ontleden, en zo niet, waarom?
Opmerking: ik ben vergeten in een string “0” en “1” op te geven. Wel nieuwsgierig dat als het al een int is, het werkt zoals ik had verwacht. Misschien veroorzaakte dit de verwarring.
Antwoord 1, autoriteit 100%
0 en (niet-nul) zijn niet gelijk aan “false” en “true”, ze zijn slechts de representatie gekozen door C. Andere talen gebruiken 0 voor true en -1 voor false, of andere schema’s volledig. Een boolean is geeneen 0 of een 1, het is een waar of een onwaar.
Moet het ook omgaan met “ja” en “nee”, “uit” en “aan”, en alle talloze andere dingen die analoog zijn aan booleans? Waar zou jij de grens trekken?
Antwoord 2, autoriteit 43%
Wat maakt booleans speciaal? Ze zijn in wezen 0 als onwaar, en niet-nul als waar in mijn ervaring…
Dat is een implementatiedetail en is helemaal niet relevant.
true
is een booleaanse waarde. false
is een booleaanse waarde. Al het andere niet.
Als je iets wilt ontleden zodat de tekenreeks “0” false
evalueert terwijl iets anders true
evalueert, kun je gebruiken:
!mystr.Equals("0");
Antwoord 3, autoriteit 28%
De hieronder getoonde gedeelde FormatHelper
klasse biedt een eenvoudige oplossing met behulp van twee varianten van een overbelaste methode genaamd StringToBoolean
.
FormatHelper.StringToBoolean(String value)
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)
Beide varianten zorgen voor een niet-hoofdlettergevoelige tekenreeksovereenkomst
1) De normale conversie van string naar boolean, standaard lege of null strings naar false
De volgende voorbeelden resulteren in een Boolean
waarde van false
:-
Boolean myBool = FormatHelper.StringToBoolean("");
Boolean myBool = FormatHelper.StringToBoolean("0");
Boolean myBool = FormatHelper.StringToBoolean("false");
Boolean myBool = FormatHelper.StringToBoolean("False");
Boolean myBool = FormatHelper.StringToBoolean("no");
Boolean myBool = FormatHelper.StringToBoolean("off");
Alle andere tekenreekswaarden resulteren in een Boolean
-waarde van true
zoals:-
Boolean myBool = FormatHelper.StringToBoolean("1");
Boolean myBool = FormatHelper.StringToBoolean("true");
Boolean myBool = FormatHelper.StringToBoolean("True");
Boolean myBool = FormatHelper.StringToBoolean("yes");
Boolean myBool = FormatHelper.StringToBoolean("xyz blah");
Opmerking: bewerk de waarde van BooleanStringOff
in de klasse hieronder om meer (of minder) waarden voor false/off op te nemen
2) Volgt dezelfde regels als 1) hierboven, maar staat toe dat een standaardwaarde van true
wordt opgegeven als het 2e argument voor de conversie.
De standaardwaarde wordt gebruikt wanneer de String
-waarde leeg of null
is. Dit is handig als een ontbrekende tekenreekswaarde een true
-status moet aangeven.
Het volgende codevoorbeeld retourneert true
Boolean myBool = FormatHelper.StringToBoolean("",true);
Het volgende codevoorbeeld retourneert false
Boolean myBool = FormatHelper.StringToBoolean("false",true);
Dit is de code voor de klasse FormatHelper
public class FormatHelper
{
public static Boolean StringToBoolean(String str)
{
return StringToBoolean(str, false);
}
public static Boolean StringToBoolean(String str, Boolean bDefault)
{
String[] BooleanStringOff = { "0", "off", "no" };
if (String.IsNullOrEmpty(str))
return bDefault;
else if(BooleanStringOff.Contains(str,StringComparer.InvariantCultureIgnoreCase))
return false;
Boolean result;
if (!Boolean.TryParse(str, out result))
result = true;
return result;
}
}
Antwoord 4, autoriteit 13%
Helaas gebeurt dit veel in .NET. Ik kan me bijvoorbeeld niet herinneren of het XML Serializer of XmlConvert is, maar een ervan mislukt als de hoofdletters van True/False niet correct zijn.
Je kunt door een geheel getal heen en weer reizen om te krijgen wat je wilt.
string s = "2";
int i = Convert.ToInt32(s);
bool b = Convert.ToBoolean(i);
In het bovenstaande geval wordt alles wat niet nul is, geëvalueerd als waar.
Om deze reden heb ik een klasse gemaakt die ik overal gebruik, genaamd ConversionStrategy, die rekening houdt met het brontype en het bestemmingstype en de meest ideale (en flexibele) conversiestrategie kiest voor het maken van de conversie.
Antwoord 5, autoriteit 8%
U wilt dat Convert.ToBoolean(int value)
niet zeker weet wat er aan de hand is met de Parse-methoden 🙂
Code zonder nuttig doel:
int falseInt = 0;
int trueInt = 1;
bool falseBool;
bool trueBool;
if (bool.TryParse(falseInt.ToString(), out falseBool))
{
if (!falseBool)
{
MessageBox.Show("TryParse: False");
}
}
if (bool.TryParse(trueInt.ToString(), out trueBool))
{
if (!trueBool)
{
MessageBox.Show("TryParse: True");
}
}
falseBool = Convert.ToBoolean(falseInt);
trueBool = Convert.ToBoolean(trueInt);
if (!falseBool)
{
MessageBox.Show("Convert: False");
}
if (trueBool)
{
MessageBox.Show("Convert: True");
}
Antwoord 6, autoriteit 6%
Wat dacht je hiervan?
byte i = 1; //or 0
bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)
Antwoord 7
Het zou moeilijk zijn om de vraag te beantwoorden. Misschien omdat de bekrompen ontwikkelaars bij Microsoft hun eigen redenen hadden? Geen gebrek aan respect voor hen bedoeld. Ze zeiden alleen dat ze niet hadden nagedacht over waarvoor het zou moeten worden gebruikt of hoe het zou worden gebruikt. Ik kan geen reden bedenken waarom mijn onderstaande extensie voor niemand zou werken. Ik bedoel, een Booleaanse waarde is aan of uit, waar of onwaar. In mijn gedachten is het eigenlijk binair. Parse-methoden voor Int, Double, Char, Long, Byte, enz. zijn meer vergevingsgezind met hun Parse-methoden.
Overweeg echter dit; U wilt zien of er een waarde in een object bestaat. Hetzelfde kan gezegd worden voor het volgende…
string myvar = "empty"; //Or maybe = "NULL"
if (String.IsNullOrEmpty(myvar))
{
//Should this be true?
}
Hoe dan ook, laten we het simpel houden. Hier is mijn oplossing waarbij ik een extensiemethode gebruik om een ToBoolean()
-methode voor een tekenreeks te maken.
using System.Linq;
public static bool ToBoolean(this string input)
{
//Define the false keywords
String[] bFalse = { "false", "0", "off", "no" };
//Return false for any of the false keywords or an empty/null value
if (String.IsNullOrEmpty(input) || bFalse.Contains(input.ToLower()))
return false;
//Return true for anything not false
return true;
}