在foreach循环中未修改值

时间:2018-12-19 05:48:09

标签: c# foreach

我来自C ++,python背景,最近开始学习C#。但是我偶然发现了一个特殊的问题,在花了相当多的时间后,我无法弄清楚。如果我似乎在尝试一些算法编码问题来学习该语言,那么它似乎太基础了,请原谅。

我有此代码

public class Solution {
    public int SmallestRangeII(int[] A, int K) {
        float mean = A.Sum() / A.Length;
        Console.WriteLine($"the mean is {mean}");

        int mini = int.MinValue;
        int maxi = int.MaxValue;
        foreach(int x in A) {
            int temp = x + ((x - mean) < 0 ? K : -K);
            Console.WriteLine($"{temp}");
            mini = Math.Min(mini, temp);
            maxi = Math.Max(maxi, temp);
            Console.WriteLine($"{mini} and {maxi}");
        }
        Console.WriteLine($"the maximum and minimum values are {maxi} and {mini}");
        return maxi - mini;
    }
}

当我传递代码时,执行此代码时,A = [1]K = 0的参数将得到输出:

the mean is 1
1
-2147483648 and 2147483647
the maximum and minimum values are 2147483647 and -2147483648

在循环的第一次迭代中,为什么maximini分别没有修改为1和1?

4 个答案:

答案 0 :(得分:0)

首先

  • 由于数组包含单个元素,因此Foreach循环仅迭代一次
  • 温度值计算为1。

    int temp = x + ((x - mean) < 0 ? K : -K);

因为K的值为0,并根据您的输入将x加上1,即1。

如果您要基于0获得最小值和最大值,那么它将提供与输入相同的结果

了解变量中存储什么值的最佳方法,可以使用Console.WriteLine()。它将在控制台上为您打印结果。像

   foreach(int x in A) {
        int temp = x + ((x - mean) < 0 ? K : -K);
        Console.WriteLine($"x: "+{x}+"\t mean: "+{mean}+"\t K: "+{K});
        Console.WriteLine($"mini: "+{mini}+"\t maxi: "+{maxi});
        Console.WriteLine($"{temp}");
        mini = Math.Min(mini, temp);
        maxi = Math.Max(maxi, temp);
        Console.WriteLine($"{mini} and {maxi}");
    }

或调试代码

答案 1 :(得分:0)

由于mini初始化为int.MinValue,因此Math.Min(mini, temp)将始终为int.MinValue

您可能想反过来初始化:miniint.MaxValuemaxiint.MinValue

答案 2 :(得分:0)

我不知道您要做什么,所以我无法提供解决方案,但是如果您查看代码,则可以看到min = -2 ^ 31,并且temp变量等于1您提供的。这两个数字的Math.Min显然会选择较小的数字-> -2 ^ 31。与最大值相同。

如果您尝试获得数组中最大和最小的木材,请尝试将最小和最大的第一个赋值更改为

int min = int.MaxValue();
int max = int.MinValue();

我想这将为您提供所需的解决方案。

答案 3 :(得分:0)

您在 foreach之前将 int.MinValue 设置为 mini ,将 int.MaxValue 设置为 maxi 方法,然后调用Min和Max方法以获取最小值和最大值。您应该考虑到在第一次迭代时,mini的值为-2147483648,因此您可以这样调用Min方法:

mini = Math.Min(-2147483648, 1);

此方法适合您。如果要将 mini 值设置为1,则有多种选择。其中之一是将mini和maxi类型更改为可为空的整数(int?)。

int? mini;
int? maxi;

然后在 foreach 中检查其值,如下所示:

foreach (int x in A)
{
    int temp = x + ((x - mean) < 0 ? K : -K);
    Console.WriteLine($"{temp}");
    if(mini.HasValue)
        mini = Math.Min(mini.Value, temp);
    else
        mini = temp;

    if(maxi.HasValue)
        maxi = Math.Max(maxi.Value, temp);
    else
        maxi = temp;
    Console.WriteLine($"{mini} and {maxi}");
}