C# 未在foreach循环内修改值 我来自C++、Python背景,最近开始学习C语言。但我偶然发现了一个特殊的问题,在花了相当长的时间之后我无法解决它。请原谅,如果它看起来太基本,因为我正在尝试一些算法编码问题来学习语言

C# 未在foreach循环内修改值 我来自C++、Python背景,最近开始学习C语言。但我偶然发现了一个特殊的问题,在花了相当长的时间之后我无法解决它。请原谅,如果它看起来太基本,因为我正在尝试一些算法编码问题来学习语言,c#,foreach,C#,Foreach,我有这个密码 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; fore

我有这个密码

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;
    }
}
在循环的第一次迭代中,
maxi
mini
为什么不分别修改为1和1

首先

  • Foreach循环将只迭代一次,因为数组包含单个元素
  • 温度值计算为1

    int-temp=x+((x-平均值)<0?K:-K)

因为
K
的值是
0
,并根据您的输入向其添加x即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}");
    }
foreach(A中的int x){
内部温度=x+((x-平均值)<0?K:-K);
WriteLine($“x:+{x}+”\t表示:“+{mean}+”\t表示:“+{K}”);
WriteLine($“mini:+{mini}+”\t maxi:+{maxi});
Console.WriteLine($“{temp}”);
mini=数学最小值(mini,temp);
最大值=数学最大值(最大值,温度);
WriteLine($“{mini}和{maxi}”);
}

或调试代码

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


您可能希望以另一种方式初始化:
mini
使用
int.MaxValue
maxi
使用
int.MinValue

我不知道您想做什么,所以我无法提供解决方案,但如果您查看代码,您会看到,在您提供的情况下,min=-2^31和temp变量等于1。这两个数字中的Math.Min显然选择了较小的数字-->-2^31。最大值也一样

如果您试图获得阵列中最大和最小的敏捷,请尝试将最小值和最大值的第一个赋值更改为

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

我想这将导致您想要的解决方案。

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

mini = Math.Min(-2147483648, 1);
这个方法适合你。如果要将mini值设置为1,则有多种选择。其中之一是将mini和maxi类型更改为可为null的整数(int?)

然后在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}");
}
foreach(A中的int x)
{
内部温度=x+((x-平均值)<0?K:-K);
Console.WriteLine($“{temp}”);
if(mini.HasValue)
最小值=数学最小值(最小值,温度);
其他的
mini=温度;
if(maxi.HasValue)
最大值=数学最大值(最大值,温度);
其他的
最大值=温度;
WriteLine($“{mini}和{maxi}”);
}
因为-
Math.Min(int.MinValue,1)
-
int.MinValue
更小,且
Math.Max(int.MaxValue,1)
-
int.MaxValue
更大。opps,我忽略了'x+
int? mini;
int? maxi;
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}");
}