【问题标题】:I don't understand why this code works?我不明白为什么这段代码有效?
【发布时间】:2023-04-01 12:07:01
【问题描述】:

类中的方法从用户那里接受一个整数以从列表中删除。该代码有效。我的问题是我不明白它为什么起作用;事实上,据我所知,它不应该工作。

public void Remove(int ValueToRemove)
    {
        bool isFound = false;
        for (int count = 0; count < CurrentIndex; count++)
        {
            if (list[count] == ValueToRemove && !isFound)
            {
                isFound = true;
                CurrentIndex = CurrentIndex -1;
            }

            if (isFound && ((count + 1) < list.Length))
            {
                list[count] = list[count + 1];
            }
        }

    }

语句不应该...

if(list[count] == ValueToRemove && !isFound)

...总是评估为假,因此跳过运行大括号内的代码? !isFound 不等同于评估

if(list[count] == ValueToRemove && isFound == true)

在代码中...

if (list[count] == ValueToRemove && !isFound)
            {
                isFound = true;
                CurrentIndex = CurrentIndex -1;
            }

...如果 CurrentIndex = CurrentIndex - 1,使 CurrentIndex 比原来的值小一,那么前一个索引会发生什么情况?

最后...

if (isFound && ((count + 1) < list.Length))
            {
                list[count] = list[count + 1];
            }

... list[count] 的值是否等于下一个索引的值(例如,索引 5 等于索引 6 中的任何值),或者该索引中包含的值是否等于更高的值(例如,如果索引 5 包含 10 的值,那么索引 5 现在将等于 11)

【问题讨论】:

  • 不,因为!isFoundisfound==false!isFound 读取为not isFound
  • 一篇文章中有多个问题并不理想。
  • 阅读这里关于逻辑否定运算符 (!) msdn.microsoft.com/en-us/library/f2kd6eb2.aspx
  • 值得注意的是,函数参数的标准大写约定是Camel Case——所以ValueToRemove应该是valueToRemove
  • 如果!isFound 等同于isFound == true,您认为isFound 等同于什么??

标签: c# arrays algorithm


【解决方案1】:

由于isFound 为假,!isFound 的计算结果为真并输入 if 语句。

这意味着!isFound同说:

isFound == false

...如果 CurrentIndex = CurrentIndex - 1,使 CurrentIndex 比原来的值小一,那么前一个索引会发生什么?

上一个索引没有任何反应,而是在列表中的当前项目上重复循环。

... list[count] 的值是否等于下一个索引的值(例如,索引 5 等于索引 6 中的任何值),或者该索引中包含的值是否等于更高的值(例如,如果索引 5 包含 10 的值,那么索引 5 现在将等于 11)

它获取列表中下一项的值并将其分配给list[count]

您可以通过设置断点和调试代码、查看正在发生的情况并随时检查值来自己回答很多此类问题。

【讨论】:

    【解决方案2】:

    回答您的问题:

    if (isFound && ((count + 1) < list.Length))
            {
                list[count] = list[count + 1];
            }
    

    条件首先检查下一个索引是否存在,然后将下一个索引的值赋给当前值。换句话说,如果 count = 5,它首先检查以确保 list[6] 不会导致未定义的偏移量,然后 list[5] = list[6] 会将 list[6] 中的值分配给 list[ 5]。因此,如果 list[5] 为 10,list[6] 为 11,则 list[5] 变为 11。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2014-06-12
      • 2022-06-10
      • 2012-05-25
      • 2012-11-17
      • 2012-09-01
      • 2010-12-14
      相关资源
      最近更新 更多