Convert.ToBoolean en Boolean.Parse accepteren geen 0 en 1

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.

trueis een booleaanse waarde. falseis een booleaanse waarde. Al het andere niet.

Als je iets wilt ontleden zodat de tekenreeks “0” falseevalueert terwijl iets anders trueevalueert, kun je gebruiken:

!mystr.Equals("0");

Antwoord 3, autoriteit 28%

De hieronder getoonde gedeelde FormatHelperklasse 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 Booleanwaarde 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 truezoals:-

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 BooleanStringOffin 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 truewordt opgegeven als het 2e argument voor de conversie.

De standaardwaarde wordt gebruikt wanneer de String-waarde leeg of nullis. 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;
}

Other episodes