ここでは、C# の専門家にとっては簡単な質問です。
基本的に、いずれかの値が TRUE であるかどうかを確認したいのですが、コードでのワイルド スタブは以下のとおりです。
if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))
{
// is true
}
これは正しいです?
ありがとう
ここでは、C# の専門家にとっては簡単な質問です。
基本的に、いずれかの値が TRUE であるかどうかを確認したいのですが、コードでのワイルド スタブは以下のとおりです。
if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))
{
// is true
}
これは正しいです?
ありがとう
EXACTLY ONE が true の場合、次のようになります。
var male = bool.Parse(staff.getValue("Male"));
var female = bool.Parse(staff.getValue("Female"));
if (male ^ female)
{
//is true
}
論理 OR を探しているようです。
if(condition1 || condition2)
{
}
||
(二重パイプ)、論理 ORを使用します。
bool isMale = Boolean.Parse(staff.getValue("Male");
bool isFemale = Boolean.Parse(staff.getValue("Female");
if (isMale || isFemale) // note double pipe ||
{
// do something if true
}
C# ステートメントでは、式は左から右に評価されます。OR 演算では、最初の式が true の場合、2 番目の式は評価されません。
条件付き OR 演算子||
が必要です
if ((Boolean.Parse(staff.getValue("Male")) || Boolean.Parse(staff.getValue("Female")))
{
//is true
}
最初の条件が の場合TRUE
、結果が明らかに を返すため、2 番目の条件はチェックされませんTRUE
。
エラーが発生した場合に例外をスローしないという理由TryParse
だけで、より高速で安全に動作することに注意してください。解析が成功したか失敗したかを示す bool を返します。Parse
TryParse
したがって、両方の解析メソッドが返さtrue
れ、その後にのみメインチェックを実行する必要があります
bool male, female;
if ((Boolean.TryParse(staff.getValue("Male"), out male) &&
Boolean.TryParse(staff.getValue("Female"), out female)) &&
(male || female)) // or ^
{
// do stuff
}
また
bool male, female;
if (Boolean.TryParse(staff.getValue("Male"), out male) &&
Boolean.TryParse(staff.getValue("Female"), out female))
{
if(male) { }
else if (female) { } // or just else
}
else
{
// staff contains wrong data. Probably "yeap" instead of "true"
}
これは同様のシナリオですが、3 つ以上の bool 値をチェックしています。
Thread th = new Thread(() =>
{
while (true)
{
bool allReadComplete = true;
foreach (IDataProvider provider in lstDataProviders)
{
provider.StartReading();
if (provider.FinishedReading)
allReadComplete = allReadComplete && provider.FinishedReading;
else
allReadComplete = provider.FinishedReading;
}
// to induce some context switching
Thread.Sleep(0);
if (allReadComplete)
break;
}
Console.WriteLine("Thread Exiting");
});
th.IsBackground = true;
th.Start();
性別が「false」ではなく「true」の値で指定されているかどうかを示すには、
bool genderIsSpecified = staff.getValue("Male") | staff.getValue("Female");
.. オブジェクトがこれらの値のどれであるかではなく、それらの値の 1 つであるかどうかのみを判断しますstaff
。
したがって、念のため、この質問は文字通りであり、抽象的な例ではありません...
男性または女性..誰もがどちらか一方です。おそらく、あなたの質問では、どちらが当てはまるかを尋ねるつもりでしたか? その場合、
bool defaultGenderIfNoGenderDocumented = true; // male
bool MaleIfTrue_FemaleIfFalse = !string.IsNullOrEmpty(staff.getValue("Male"))
? bool.Parse(staff.getValue("Male"))
: string.IsNullOrEmpty(staff.getValue("Female"))
? bool.Parse(staff.getValue("Female"))
? false
: defaultGenderIfNoGenderDocumented
: defaultGenderIfNoGenderDocumented;
または単に、
// assume value is properly populated, ignore "Female" value
bool isMale = bool.Parse(staff.getValue("Male"));
とにかく、少しの例外チェックが必要です。Boolean.Parse() メソッドは引数として文字列を取得し、空白を取り除いた引数が「True」または「False」に等しい場合にのみ、true
またはそのいずれかを返します (大文字化に注意してください)。それ以外の場合、関数は例外を返します。false
と の可能な値がまさにこの 2 つであると仮定すると、単純な論理和 ( staff.getValue("Male")
)で十分です。および空の文字列を含む他の戻り値が可能な場合は、例外を確認する必要がありますstaff.getValue("Female")
||
null
bool isMale;
try {
isMale = Boolean.Parse(staff.getValue("Male"));
} catch(Exception e) {
isMale = Boolean.False;
}
try {
isFemale = Boolean.Parse(staff.getValue("Female"));
} catch(Exception e) {
isFemale = Boolean.False;
}
if (isMale || isFemale) // note double pipe ||
{
// do something if true
}
または手動で比較する
bool isMale = Boolean.TrueValue == staff.getValue("Male");
bool isFemale = Boolean.TrueValue == staff.getValue("Female");
if (isMale || isFemale) // note double pipe ||
{
// do something if true
}