繁体   English   中英

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

How to simplify this test condition on strings: if one is entered, the other must be entered too?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我写了以下条件表达式。 它工作得很好......我正在尝试找出/学习一种减少代码量的聪明方法。 也许以高级方式使用一些 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.";
}
1 个回复

评估是否满足两个条件之一,但不是两者相等

( !a && b ) || ( a && !b )

您可以使用^ aka XOR :一个或另一个,但不能同时使用。

  if ( string.IsNullOrWhiteSpace(ProxyServer.ParameterValue) ^ string.IsNullOrWhiteSpace(ProxyPort.ParameterValue) )
  {
    ...
  }

结果如下:

ProxyServer    ProxyPort    IsNotProvided(ProxyServer) ^ IsNotProvided(ProxyPort)

empty          empty        false
provided       empty        true
empty          provided     true
provided       provided     false

逻辑异或运算符(C# 语言参考)

德摩根定律

评估是否满足多个条件之一但并非所有条件都相等

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

测试

  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"));

(希望我不要忘记组合......)

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

具有泛型和委托的版本

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;
}

用法

Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "", ""));
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "a", ""));
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "", "a"));
Console.WriteLine(CheckIfOneIsTrueButNotAllAreEqual(string.IsNullOrWhiteSpace, "a", "a"));
1 使用 strsplit() 简化字符串的输入

我怎样才能重现这个: 使用如下所示的格式: 我真的厌倦了复制和粘贴', '\n')[[1]][-1] 。 这里的总体目标是避免在每个字符串周围键入“双引号”。 ...

2011-05-01 23:40:49 2 645   r
3 超简化字符串python

我在这个简单的hackerrank问题上遇到了问题。 我的代码在编译器中工作,但hackerrank 测试失败了6 个测试用例。 其中一个我的输出是正确的(我没有支付溢价)。 这里有什么问题吗? 提示: Steve 有一串范围为 ascii['a'..'z'] 的小写字符。 他想通过执行一系列操作 ...

4 简化字符串迭代

我正处于学习编码(特别是C)的初期。 在编写一个用于计算数组字符以供研究的函数时,我在问自己(我很确定),是否有可能简化此迭代: 我想将i++保留在迭代本身内(用于循环?)。 我很感谢你们给我的任何暗示。 如果您发现与我无关的问题而我做错了-请让我知道。 ...

2016-12-06 10:42:25 4 108   c/ loops
5 简化字符串异常检查

在我的代码中,我将运行一个过程并检索部分标准错误输出(一个数字),以引发一个发送进度号的事件。 有时我在“ .First”方法的这一行出现异常,因为该字符串没有任何分割内容: 问题是我想添加必要的检查来避免该异常而不进行尝试/捕获,因为在我的速度测试中,我注意到此过程中的尝试/捕获 ...

6 简化字符串拆分

我从SQL查询中获得了这样的结果“PR242714031213”。 这基本上是一个字符串PR + ssmmHHddMMyy。 我需要将其提取并格式化为简单的日期ddMMyyyy。 我正在使用以下代码片段,其中包含正在运行的子字符串: 我想知道我是否可以简化代码以获得ddMMyyyy ...

10 需要帮助以简化字符串列表

有人可以帮我简化这些字符串列表吗: 由于老客户的电子邮件将在不到一周的时间内超过10.000,您能建议我一个简单的方法来从MyList类中选择字符串并启用正确的布尔值吗? 如果oneOfTheStringInThisList.matches(possibleEmail)mIsOld ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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