【问题标题】:adding script to find min value to a for loop c#添加脚本以查找最小值到for循环c#
【发布时间】:2016-11-09 17:49:35
【问题描述】:

我正在添加到我的 for 循环中以查找我从解析文本文件获得的数组中的最小值和最大值。找到最大值很容易,但是对于最小值,我在应该为 1 的地方得到了一个零值。这是我用于循环的内容-(到目前为止,我只是在测试以获取 temp 的最小值。 x)

       for (int i = 0; i < lineCount; i++) {

        string line = dataLines [i];
        lineValues = line.Split (' ');

        Vector4 temp = new Vector4 ();
        Vector3 center = new Vector3 ();

        temp.x = float.Parse (lineValues [0]);

        maxvalueX = float.MinValue;
        minvalueX = float.MaxValue;

        if (temp.x > maxvalueX) { maxvalueX = temp.x; } 
        if (temp.x < minvalueX) { minvalueX = temp.x; }

        temp.y = float.Parse (lineValues [1]);
            if (temp.y > maxvalueY) { maxvalueY = temp.y; }

        temp.z = float.Parse (lineValues [2]);
            if (temp.z > maxvalueZ) { maxvalueZ = temp.z; }

        temp.w = float.Parse (lineValues [3]);

        data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w);
        data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w);
        //int value = data.myData [i].x;

        center.x = ((maxvalueX-1)/2);
        center.y = ((maxvalueY-1)/2);
        center.z = ((maxvalueZ-1)/2);

        data.dataCenter.Set (scaleFactor*center.x, scaleFactor*center.y, scaleFactor*center.z);
    }

任何关于这里出了什么问题的想法将不胜感激!谢谢! 仁

【问题讨论】:

  • 您将最小值初始化为什么?通常,您希望将它们设置为 float.MaxValue 之类的东西。如果你不初始化它们,那么它们默认为 0,小于 1。如果你的所有值都是负数,你会遇到与 max 相同类型的问题,所以它真的应该初始化为类似 @987654323 @.
  • 为什么不使用 dataLines.Min();买最小的?
  • 您需要将maxvalueX = float.MinValue;minvalueX = float.MaxValue;放在循环之前以避免重置值。

标签: c# arrays unity3d min


【解决方案1】:

找到最小值的最简单方法是与最大值相反,即

if (temp.x > maxvalueX) { maxvalueX = temp.x; } 
if (temp.x < minvalueX) { minvalueX = temp.x; } 

请注意,如果最低值可能高于 0 或最高值低于 0,则将 max 和 min 默认值设置为 0 会给您带来问题。在循环之前,您应该像这样设置它们:

float maxvalueX = float.MinValue;
float minvalueX = float.MaxValue;

这样您就可以确保无论遇到什么值,数字都会被重置。确保您处理它们也没有要考虑的值的情况。


更新:

我已将您的代码的完整更新版本包含在 cmets 中以说明我的意思:

// These should be before the loop just to avoid resetting the max/min values
float maxvalueX = float.MinValue;
float minvalueX = float.MaxValue;

  for (int i = 0; i < lineCount; i++) {

    string line = dataLines [i];
    lineValues = line.Split (' ');

    Vector4 temp = new Vector4 ();
    Vector3 center = new Vector3 ();

    temp.x = float.Parse (lineValues [0]);
    if (temp.x > maxvalueX) { maxvalueX = temp.x; } 
    if (temp.x < minvalueX) { minvalueX = temp.x; }

    temp.y = float.Parse (lineValues [1]);
        if (temp.y > maxvalueY) { maxvalueY = temp.y; }

    temp.z = float.Parse (lineValues [2]);
        if (temp.z > maxvalueZ) { maxvalueZ = temp.z; }

    temp.w = float.Parse (lineValues [3]);

    data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w);
    data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w);
    //int value = data.myData [i].x;
}

// I've moved these out of the loop as they only use the final max/min values
    center.x = ((maxvalueX-1)/2);
    center.y = ((maxvalueY-1)/2);
    center.z = ((maxvalueZ-1)/2);

    data.dataCenter.Set (scaleFactor*center.x, scaleFactor*center.y, scaleFactor*center.z);

【讨论】:

  • 我已经添加了这个,它将最小值更改为最大值-谢谢!
  • 你确定你没有在某个地方不小心用maxvalueX 代替minvalueX 吗?复制和粘贴线条时轻松完成。
  • 非常感谢!我把 float maxvalueX = float.MinValue;浮动 minvalueX = float.MaxValue;在循环。再次感谢!
【解决方案2】:

试试这个

if (minvalueX  < temp.x) 
{
  valueX = temp.x;
  minvalueX = valueX;
}

【讨论】:

    猜你喜欢
    • 2016-08-05
    • 2018-09-21
    • 1970-01-01
    • 2015-04-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多