简体   繁体   English

如何简化对字符串的测试条件:如果输入了一个,那么另一个也必须输入?

[英]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# 语言参考)

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:要检查两个以上的值,您也许可以使用@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM