"0" ve "1" yanlış ve doğruya nasıl dönüştürülür


90

Bir veritabanına Odbc üzerinden bağlanan bir yöntemim var. Aradığım saklı yordamın, veritabanı tarafından bir 'Char' olan bir dönüş değeri var. Şu anda bu dönüş değerini bir dizge olarak alıyorum ve basit bir if ifadesinde kullanıyorum. Veritabanından 0 ve 1 olmak üzere yalnızca iki değer geri döndüğünde böyle bir dizeyi karşılaştırma fikrini gerçekten sevmiyorum.

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;
} 

Bu durumu halletmenin doğru yolu ne olabilir? Açık bir cevap gibi görünen 'Convert.ToBoolean ()' ı denedim, ancak 'String geçerli bir Boolean olarak tanınmadı. 'istisna atılıyor. Burada bir şey mi özlüyorum yoksa "1" ve "0" ın doğru ve yanlış gibi davranmasını sağlamanın başka bir yolu var mı?

Teşekkürler!

Yanıtlar:


157

Peki ya:

return (returnValue == "1");

veya aşağıda önerildiği gibi:

return (returnValue != "0");

Doğru olan, bir başarı sonucu olarak aradığınız şeye bağlı olacaktır.


9
Doğru? Kontrol; Özlü? Kontrol; Zarif? Kontrol. +1.
Earlz

12
Kullanmanızı tavsiye ederim return (returnValue!="0"). O daha doğal olurdu 0olduğunu falseve sıfır değildir her sayıdır true. Elbette burada Chris'in sayılar yerine dizgeleri kullandığı bir durum var, bu yüzden bu yorum sadece kısmen geçerli;)
Gacek

Bu her zaman bir tartışma. 0 aynı zamanda ERROR_SUCCESS anlamına gelir, bu da her şeyin yolunda gittiği anlamına gelir. Ama daha doğal olduğu konusunda Gacek'e katılıyorum.
Pierre-Alain Vigeant

3
Boş değerleri kontrol etmeyi unutmayın
:! String.IsNullOrEmpty

2
neden Convert.ToBoolean (1) değil? Aynı şeyi yapıyor ve kontrol için çerçeveyi kullanıyorsunuz. Yukarıdaki cevabı da beğendim ama hangisinin kullanılması daha iyi?
user20358

107

Tek bir kod satırında:

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

3
Chris sürümünüzü beğendim çünkü soruda belirtildiği gibi dizeleri karşılaştırmak yerine boole kullanalım.
Svet

Ayrıca, niyeti daha net ifade ettiği için versiyonunuzu da tercih ediyorum.
BornToCode

Yalnızca "1" veya "0" için uygundur. Diğer herhangi bir dizge için dönüş değeri deterministik değildir, örneğin "101" doğrudur ve böyle devam eder ...
szubajak

12

Dönüşümün her zaman başarılı olmasını istiyorsanız, muhtemelen dizeyi dönüştürmenin en iyi yolu "1"olarak trueve başka herhangi bir şeyi false(Kevin'ın yaptığı gibi) düşünmek olacaktır . Başka bir şey döndürülürse "1"veya dönüşümün başarısız olmasını "0"istiyorsanız, aşağıdakiler yeterli olacaktır (bunu bir yardımcı yönteme koyabilirsiniz):

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.");
}

Tanınmayan değeri yakalamak güzel bir fikir. O şekilde gitmek istediğimden emin değilim, ama yine de iyi bir fikir.
Chris

5

Dönüş türünü sayısal olarak ayarlayın - bir karaktere ihtiyacınız yoktur (bu yüzden kullanmayın); bir sayısal değer (0/1) Convert.ToBoolean (num) ile dönüştürülebilir

Aksi takdirde: Kevin'in cevabını kullanın


Keşke dönüş türünü değiştirebilseydik. Ama ne olduğuna bağlı kaldık.
Chris

10
Convert.ToBooleansadece Doğru / doğru / Yanlış / yanlış dizeleri kabul eder
Yaro

5

Bu formu kullanabilirsiniz:

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

Ya da daha basitçe (Jurijs Kastanovs sayesinde):

return returnValue.Equals("1");

7
Sadece "? True: false" bitini kaybedin. Tamamen gereksiz. {Return returnValue.Equals ("1")} olarak
bırakın

2

Veya Boolean değeri döndürülmediyse, şöyle bir şey yapabilirsiniz:

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

1

Çözümüm (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

Dönüştürmek istemiyorsanız sadece kullanın;

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

Belki de değerleri istediğiniz gibi döndüreceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.