วิธีแปลง“ 0” และ“ 1” เป็นเท็จและจริง


90

ฉันมีวิธีการที่เชื่อมต่อกับฐานข้อมูลผ่าน Odbc ขั้นตอนการจัดเก็บที่ฉันเรียกมีค่าส่งคืนซึ่งจากด้านฐานข้อมูลคือ 'Char' ตอนนี้ฉันกำลังจับค่าที่ส่งคืนเป็นสตริงและใช้ในคำสั่ง if อย่างง่าย ฉันไม่ชอบแนวคิดในการเปรียบเทียบสตริงแบบนี้เมื่อมีเพียงสองค่าเท่านั้นที่สามารถกลับมาจากฐานข้อมูลคือ 0 และ 1

OdbcCommand fetchCommand = new OdbcCommand(storedProc, conn);

fetchCommand.CommandType = CommandType.StoredProcedure;
fetchCommand.Parameters.AddWithValue("@column ", myCustomParameter);
fetchCommand.Parameters.Add("@myReturnValue", OdbcType.Char, 1)
            .Direction = ParameterDirection.Output;
fetchCommand.ExecuteNonQuery();

string returnValue = fetchCommand.Parameters["@myReturnValue"].Value.ToString();
if (returnValue == "1")
{
    return true;
} 

อะไรคือวิธีที่เหมาะสมในการจัดการกับสถานการณ์นี้ ฉันได้ลอง 'Convert ToBoolean ()' ซึ่งดูเหมือนจะเป็นคำตอบที่ชัดเจน แต่ฉันพบว่า 'String ไม่ได้รับการยอมรับว่าเป็นบูลีนที่ถูกต้อง 'ยกเว้นถูกโยนทิ้ง ฉันพลาดอะไรบางอย่างที่นี่หรือมีวิธีอื่นในการทำให้ '1' และ '0' ทำหน้าที่เหมือนจริงและเท็จ

ขอบคุณ!

คำตอบ:


157

เกี่ยวกับ:

return (returnValue == "1");

หรือตามคำแนะนำด้านล่าง:

return (returnValue != "0");

สิ่งที่ถูกต้องจะขึ้นอยู่กับสิ่งที่คุณกำลังมองหาเป็นผลสำเร็จ


9
แก้ไข? ตรวจสอบ; กระชับ? ตรวจสอบ; สง่างาม? ตรวจสอบ. +1.
Earlz

12
return (returnValue!="0")ฉันจะแนะนำให้ใช้ มันจะเป็นธรรมชาติมากขึ้นว่า0เป็นและตัวเลขที่ไม่เป็นศูนย์ทุกfalse trueแน่นอนว่าที่นี่เรามีกรณีที่คริสใช้สตริงแทนตัวเลขดังนั้นความคิดเห็นนี้จึงใช้ได้เพียงบางส่วนเท่านั้น)
Gacek

เป็นเรื่องที่ถกเถียงกันอยู่เสมอ 0 ยังหมายถึง ERROR_SUCCESS ซึ่งหมายความว่าทุกอย่างเป็นไปด้วยดี แต่ฉันเห็นด้วยกับ Gacek ว่ามันเป็นธรรมชาติมากกว่า
Pierre-Alain Vigeant

3
อย่าลืมตรวจสอบ nulls:! string.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore

2
ทำไมไม่แปลง ToBoolean (1)? มันทำเช่นเดียวกันและคุณกำลังใช้กรอบการตรวจสอบ ฉันชอบคำตอบข้างบนเช่นกัน แต่อันไหนดีกว่าที่จะใช้?
user20358

106

ในโค้ดบรรทัดเดียว:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))

3
ฉันชอบคริสเวอร์ชันของคุณเพราะตามคำถามที่ระบุให้ใช้บูลีนแทนการเปรียบเทียบสตริง
Svet

ฉันชอบเวอร์ชันของคุณมากกว่าเพราะสื่อถึงเจตนาที่ชัดเจนกว่า
BornToCode

เหมาะสำหรับ "1" หรือ "0" เท่านั้น สำหรับค่าส่งคืนสตริงอื่น ๆ จะไม่ถูกกำหนดตัวอย่างเช่น "101" เป็นจริงเป็นต้น ...
szubajak

12

หากคุณต้องการให้การแปลงประสบความสำเร็จอยู่เสมอวิธีที่ดีที่สุดในการแปลงสตริงคือการพิจารณา"1"เป็นtrueและอย่างอื่นเช่นfalse(เช่นเดียวกับที่เควินทำ) หากคุณต้องการให้การแปลงล้มเหลวหากมีสิ่งอื่นที่ไม่ใช่"1"หรือ"0"ถูกส่งกลับสิ่งต่อไปนี้ก็เพียงพอแล้ว (คุณสามารถใส่ลงในวิธีการช่วยเหลือ):

if (returnValue == "1")
{
    return true;
}
else if (returnValue == "0")
{
    return false;
}
else
{
    throw new FormatException("The string is not a recognized as a valid boolean value.");
}

เป็นความคิดที่ดีที่จะจับมูลค่าที่ไม่รู้จัก ไม่แน่ใจว่าฉันต้องการไปทางนั้น แต่ก็ยังเป็นความคิดที่ดี
คริส

5

ตั้งค่าประเภทการส่งคืนเป็นตัวเลข - คุณไม่จำเป็นต้องใช้ถ่าน (ดังนั้นอย่าใช้มัน) ค่าตัวเลข (0/1) สามารถแปลงได้ด้วย Convert ToBoolean (num)

มิฉะนั้นให้ใช้คำตอบของ Kevin


ฉันหวังว่าเราจะเปลี่ยนประเภทการคืนสินค้าได้ แต่เราติดอยู่กับสิ่งที่เป็นอยู่
คริส

10
Convert.ToBooleanยอมรับเฉพาะสตริง True / true / False / false
Yaro

5

คุณสามารถใช้แบบฟอร์มดังกล่าว:

return returnValue.Equals("1") ? true : false;

หรือมากกว่านั้น (ขอบคุณ Jurijs Kastanovs):

return returnValue.Equals("1");

7
แค่เสียบิต "? true: false" มันไม่จำเป็นโดยสิ้นเชิง ทิ้งไว้ที่ {return returnValue.Equals ("1")}
Jurijs Kastanovs

2

หรือถ้าไม่ส่งคืนค่าบูลีนคุณสามารถทำสิ่งนี้ได้:

bool boolValue = (returnValue == "1");

1

วิธีแก้ปัญหาของฉัน (vb.net):

Private Function ConvertToBoolean(p1 As Object) As Boolean
    If p1 Is Nothing Then Return False
    If IsDBNull(p1) Then Return False
    If p1.ToString = "1" Then Return True
    If p1.ToString.ToLower = "true" Then Return True
    Return False
End Function


-1

หากคุณไม่ต้องการแปลงเพียงใช้;

 bool _status = status == "1" ? true : false;

บางทีคุณอาจจะคืนค่าตามที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.