Reputation: 31
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.
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.";
}
Upvotes: 0
Views: 63
Reputation:
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.
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)
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:
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
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"));
Upvotes: 2