【问题标题】:If previous element in int array == bool variable如果 int 数组中的前一个元素 == bool 变量
【发布时间】:2019-12-06 16:50:05
【问题描述】:

大部分是 C# 新手。我正在创建一个保龄球得分应用程序

我正在编写一个 if 语句来确定我的 int[] array 中的 前一个元素(它的 bool 变量在之前的代码中设置为 true)是否为 true

我知道你不能有int == bool,但我不知道我是如何写出这个声明的。

public static bool isStrike = false; //Global Declaration

Console.WriteLine("..."); 

rollOne = Convert.ToInt32(Console.ReadLine());

if (...) {
    isStrike = true;
}

if (array[int - 1] == isStrike) 
{
...
}

我希望语句验证数组中的前一个元素isStrike bool 设置为true

【问题讨论】:

  • 使用List 而不是数组。然后向List 询问其最后一个条目。
  • 我认为使用 OOP 是不可能的?
  • 这是什么? array[int - 1]。 int 是一个关键字,不能像标识符一样在那里使用。

标签: c# int boolean


【解决方案1】:

通过一些映射将您的整数转换为布尔值。
通常的做法是让 0: false, non 0: true:

if ((intArray[i - 1] != 0) == boolVar)
{...}

(intArray[i - 1] != 0) 计算为一个布尔表达式,您可以与之进行比较。

但是,您应该始终检查用户输入。如果您这样做并删除了对 MVCE 的检查,那么干得好。

检查用户输入:

String strInput = Console.ReadLine();
int input = int.MinValue;
// try to parse the string into an integer, returns false if failed. otherwise true.
// if successfull input will be assigned the parsed value by reference.
// int.Parse() will return an integer directly, and will throw an exception on error. this should be used with strings that should always be integers
// try parse should be used where users can enter dumb things.
if (int.TryParse(strInput, out input))
{
    if (input >= 1 /*1 because you subtract 1 in your code. otherwise 0*/ && input <= intArray.Length)
    {...}
    else
    {/*bad value, out of bounds.*/}
}
else
{/*error message*/}

【讨论】:

  • intArray[i - 1] == (boolVar ? 1 : 0) 可以,如果我们确定intArray所有项目01;当intArray[i - 1] != 0 是典型的intbool 映射。用户输入验证是非常好的做法;能否请您提供一个示例:int.TryParse 后跟 borders check,因为您已突出显示该主题?
  • 我建议将int.TryParse 放入while (在他提供错误输入时继续询问用户); +1
  • @DmitryBychenko 我认为这太过分了。问题是如何将整数与布尔值进行比较,而不是如何要求用户输入。
【解决方案2】:

通常,我们将int 映射到bool 为:

 integer_value == 0  => corresponds to false
 integer_value != 0  => corresponds to true

我们可以这样写

 bool value = integer_value != 0

在您的情况下,如果 rollOne 是您要检查的索引(如果 array[rollOne - 1] 的值是这样的......)

 public static bool isStrike = false; //Global Declaration

 ...

 isStrike = true;

 ...

 //TODO: validate user input. What if user write "Bla-Bla-Bla"?
 rollOne = Convert.ToInt32(Console.ReadLine());

 // Do not forget to validate user input: wahat if rollOne = -1234? rollOne = 1234567890? 
 if ((rollOne > 0 && rollOne < array.Length) && 
     ((array[rollOne - 1] != 0) == isStrike)) {
   // rollOne is a valid index (not, say, -1234)
   // array[rollOne - 1] when treated as bool equals to isStrike
 }
 else 
 {
   // either index is wrong or array[rollOne - 1] doesn't correspond to isStrike
 }

如果你想检查是否,你应该使用一些不同的代码

  1. isStriketrue
  2. array[rollOne - 1] 也对应于true

代码:

...

if ((isStrike) && 
    (rollOne > 0 && rollOne < array.Length) && 
    (array[rollOne - 1] != 0)) {
   // isStrike is true 
   // rollOne is a valid index (not, say, -1234)
   // array[rollOne - 1] when treated as bool equals to isStrike (true)
 }

【讨论】:

  • 虽然不是必需的,但为了便于阅读,我会在赋值中的布尔表达式周围放置一些 ()
  • rollOne &gt; 0 应该是 rollOne &gt;= 1 以使其更具可读性。 rollOne &lt; array.Length 应该是 rollOne &lt;= array.Length 以允许选择最后一个索引。也许?
  • @FalcoGer:谢谢! rollOne &gt;= 1 会比rollOne &gt; 0 看起来更具可读性。但是,根据所提供的信息,我怀疑rollOne &lt;= array.Length 是否是正确的选择。通常,我们检查前一个项目的条件并对当前项目做/不做某事(例如“如果前一个对应于true,则将1 添加到当前”)。在这种情况下,rollOne &lt;= array.Length 将是错误的代码。
猜你喜欢
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多