[英]How to simplify this test condition on strings: if one is entered, the other must be entered too?
I have written the following condition expression.我写了以下条件表达式。 It works just fine...I am trying to figure out/learn a clever way to decrease the amount of code.
它工作得很好......我正在尝试找出/学习一种减少代码量的聪明方法。 Perhaps using some c# Boolean logical operators in an advanced manner.
也许以高级方式使用一些 c# Boolean 逻辑运算符。
if ((!String.IsNullOrWhiteSpace(ProxyServer.ParameterValue) &&
String.IsNullOrWhiteSpace(ProxyPort.ParameterValue))
|| (!String.IsNullOrWhiteSpace(ProxyPort.ParameterValue) &&
String.IsNullOrWhiteSpace(ProxyServer.ParameterValue)))
{
result = "If one is present, both must be entered for Proxy Server, Proxy Port.";
}
Evaluate if one of two conditions is satisfied but not both are equal评估是否满足两个条件之一,但不是两者相等
( !a && b ) || ( a && !b )
You can use the ^
aka the XOR : one or other but not both.您可以使用
^
aka XOR :一个或另一个,但不能同时使用。
if ( string.IsNullOrWhiteSpace(ProxyServer.ParameterValue) ^ string.IsNullOrWhiteSpace(ProxyPort.ParameterValue) )
{
...
}
Thus here are the results:结果如下:
ProxyServer ProxyPort IsNotProvided(ProxyServer) ^ IsNotProvided(ProxyPort)
empty empty false
provided empty true
empty provided true
provided provided false
Logical exclusive OR operator (C# Language reference) 逻辑异或运算符(C# 语言参考)
Evaluate if one of several conditions is satisfied but not all are equal评估是否满足多个条件之一但并非所有条件都相等
To check more than two values, you can perhaps use the LINQ suggested by @itsme86, else this method for speed and memory performance:要检查两个以上的值,您也许可以使用@itsme86 建议的 LINQ,否则此方法可以提高速度和 memory 性能:
static bool CheckIfOneIsProvidedAndSomeOthersNot(params string[] values)
{
if ( values.Length < 2 ) return false; // or throw new Exception();
bool firstIsNullOrWhiteSpace = string.IsNullOrWhiteSpace(values[0]);
bool result = firstIsNullOrWhiteSpace ^ string.IsNullOrWhiteSpace(values[1]);
if ( values.Length > 2 )
for ( int index = 2; index < values.Length; index++ )
result = result || ( firstIsNullOrWhiteSpace ^ string.IsNullOrWhiteSpace(values[index]) );
return result;
}
Test测试
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a"));
Console.WriteLine();
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a", "a"));
Console.WriteLine();
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "", "", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "", "", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", "", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "", "", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a", "", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "", "a", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", "", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a", "a", ""));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("", "a", "a", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "", "a", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a", "", "a"));
Console.WriteLine(CheckIfOneIsProvidedAndSomeOthersNot("a", "a", "a", "a"));
(Hope I don't forget combinations...) (希望我不要忘记组合......)
Output Output
False
True
True
False
False
True
True
True
True
True
True
False
False
True
True
True
True
True
True
True
True
True
True
True
True
True
True
False
Version with a generic and a delegate具有泛型和委托的版本
static bool CheckIfOneIsTrueButNotAllAreEqual<T>(Func<T, bool> check, params T[] values)
{
if ( values.Length < 2 ) return false; // or throw new Exception();
bool resultFirst = check(values[0]);
bool result = resultFirst ^ check(values[1]);
if ( values.Length > 2 )
for ( int index = 2; index < values.Length; index++ )
result = result || ( resultFirst ^ check(values[index]) );
return result;
}
Usage用法
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "", ""));
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "a", ""));
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "", "a"));
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "a", "a"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.