2016-07-07 118 views
0

我正在添加到我的for循環來查找數組中的最小值和最大值,我從解析文本文件中獲得。找到最大值很容易,但對於最小我得到一個值爲零,它應該是1.這是我用於循環 - (我到目前爲止,我只測試得到最低溫度。 x)添加腳本來找到for循環的最小值c#

 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); 
    } 

關於這裏出錯的任何想法將不勝感激!謝謝! 仁

+0

你是什麼初始化最小值爲?通常你想把它們設置爲'float.MaxValue'。如果你不初始化它們,那麼默認情況下它們將爲0,它小於1.如果你所有的值都是負數,你會得到與max相同類型的問題,所以它應該被初始化爲'float .MinValue'。 – juharr

+0

爲什麼你不使用dataLines.Min();得到最小的一個? – Naeim

+1

您需要在循環前放置'maxvalueX = float.MinValue;'和'minvalueX = float.MaxValue;'以避免重置值。 – Octopoid

回答

6

找到最小值最簡單的方法就是做你的最大價值所做的正好相反,即

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

熊分鐘,如果有可能的最低值大於0或者最高值低於0,將最大和最小默認值設置爲0會導致您遇到問題。在循環之前,你應該像這樣設置它們:

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

這樣你就可以確定這些數字將被重置,而不管它們遇到的值如何。確保你處理他們沒有值得考慮的情況。


UPDATE:

我已經包含在評論你的代碼的完整更新版本來證明我的意思:

// 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); 
+0

我已經添加了這個,它將最小值更改爲最大值 - 謝謝你! – jrogers12

+0

你確定你沒有意外地在某處使用'maxvalueX'來代替'minvalueX'嗎?複製和粘貼線條時輕鬆完成。 – Octopoid

+0

非常感謝!我已經把float maxvalueX = float.MinValue; float minvalueX = float.MaxValue;在循環。再次感謝! – jrogers12

0

試試這個

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

我已經試過,但謝謝你! – jrogers12