2016-10-13 51 views
-2

「文字列が有効なブール値として認識されませんでした」というエラーが表示されるC#でコーディングしているため、問題の内容を確認できないようです。どんな洞察も非常に高く評価されるだろう。 bool.Parse("Y")ような何かをしようとすると文字列が有効なブール値として認識されないC#

void Method() 
{ 
string arr = new[] { "Y", "n", "N", "y"}; 

foreach (string value in arr) 
{ 
    // If it DOES equal "y", then this is "true"; otherwise "false" 
    bool boolean = value.Trim().ToLower().Equals("y"); 
} 
} 

:これはあなたが一種のこのサンプルコードのようなものをしなければならない「Y」/「N」が含まれている場合

public static SalesInfo Parse(string stringValue) 
    { 
     string[] words; 
     SalesInfo salesInfo = new SalesInfo(); 

     words = StringMethods.ParseCsvString(stringValue.Trim()); 
     salesInfo.ID = int.Parse(words[0]); 
     salesInfo.Name = words[1]; 
     salesInfo.City = words[2]; 
     salesInfo.Senior = bool.Parse(words[3]);<----Error here 
     salesInfo.Veteran = bool.Parse(words[4]); 
     salesInfo.PurDate = Date.Parse(words[5]); 
     salesInfo.ItemPrice = Double.Parse(words[6]); 
     salesInfo.Quantity = int.Parse(words[7]); 

     return salesInfo; 
    } 
+2

'words [3]'の値は何ですか? – Steve

+0

ここに入力されているものは何でしょうか...これは重複している可能性がありますhttp://stackoverflow.com/questions/24805011/string-was-not-recognized-as-a-valid-boolean-when-added-to- visible-attribute – Geeky

+0

"Y"または "N"のいずれか – walkerofskies1

答えて

3

bool.Parseは唯一の「true」または「false」の文字列(大文字と小文字を区別しない)を解析します。

bool.TryParseのMSDNドキュメントは、解析できる文字列の種類の良い例を示しています。

入力文字列が「真実性」の別のバリエーションである場合は、独自のパーサーを作成する必要があります。何かのように:

public static SalesInfo Parse(string stringValue) 
{ 
    ...cut for brevity... 

    salesInfo.Senior = ParseBool(words[3]); 

    return salesInfo; 
} 

public bool ParseBool(string input) 
{ 
    switch (input.ToLower()) 
    { 
     case "y": 
     case "yes": 
      return true; 
     default: 
      return false; 
    } 
} 
+0

@Igor私は本当にそのコンセプトを実証していましたが、確かです。 – Steve

+0

私はこのアプローチが好きです、私はupvoted。 CSVファイルに「不良」データがある場合に備えて、「n」、「no」などの別のケースを追加し、デフォルトのケースでデータが不良であることを示す例外をスローすることもできます。 – EJoshuaS

+0

あなたのお手伝いをさせていただきありがとうございます! – walkerofskies1

1

:これは、それが失敗しています私のコードです間違いなく例外がスローされます。

上記のコードサンプルの弱点は、データが悪い(つまり、 "Y"または "N"以外のものが含まれている)場合、それを検出しないことです。

public static SalesInfo Parse(string stringValue) 
{ 
    string[] words; 
    SalesInfo salesInfo = new SalesInfo(); 

    words = StringMethods.ParseCsvString(stringValue.Trim()); 
    salesInfo.ID = int.Parse(words[0]); 
    salesInfo.Name = words[1]; 
    salesInfo.City = words[2]; 
    // Solution here 
    salesInfo.Senior = words[3].Trim().ToLower().Equals("y"); 
    salesInfo.Veteran = bool.Parse(words[4]); 
    salesInfo.PurDate = Date.Parse(words[5]); 
    salesInfo.ItemPrice = Double.Parse(words[6]); 
    salesInfo.Quantity = int.Parse(words[7]); 

    return salesInfo; 
} 

私はスティーブのアプローチもよく似ています。次のように一つの可能​​な変異体である:

public bool ParseBool(string input) 
{ 
    if (input == null) 
     throw new ArgumentNullException("input"); 

    switch (input.ToLower()) 
    { 
     case "y": 
     case "yes": 
      return true; 

     case "n": 
     case "no": 
      return false; 

     // If the CSV file is wrong (i.e. it contains "bad" data) 
     default: 
      return throw new ArgumentException("bad data - not a bool"); 
    } 
} 
関連する問題