Bruce B Wilson
Bruce B Wilson

Reputation: 31

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.

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

Answers (1)

user12031933
user12031933

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)

De Morgan's laws

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

Related Questions