2017-08-08 93 views
0

我一直在成功运行此语法的一个变量,但现在我正试图将其更改为foeach()循环,并采用一系列值并将结果显示为消息框。我在语法上的问题是ecll始终保留传递的第一个数字的值,并且对于数组中的每个后续数字都不会更新计算。计算未更新

我在哪里发生了错误,是为了防止它被更新为数组中的每个后续数字?

private void btnGetData_Click(object sender, EventArgs e) 
{ 
    int start = 2; 
    int end = 10; 

    int[] nums = Enumerable.Range(start, end - start).ToArray(); 

    foreach (int n in nums) 
    { 
     float tp_x = 0, tp_y = 0; 

     SAP = new List<PointF>(); 
     float fbw = m_pd.bl[m_pd.bl.Count - 1].m_Width; 
     float Location1_X = tp_x + fbw; 
     float Location1_Y = tp_y; 
     SAP.Add(new PointF(Location1_X, Location1_Y)); 

     float iBH = gbh(m_pd.bl.Count - 1); 
     float lbw = m_pd.bl[0].m_Width; 
     float Location2_X = tp_x + lbw; 
     float Location2_Y = tp_y + (iBH) + 1.5f; 

     PointF rip = new PointF(); 
     if (!Getrip(ftp, rhep, ref rip)) 
     { 
     SAP = null; 
     return; 
     } 

     for (int iRowIndex = saii; iRowIndex < m_pd.pp.Count; iRowIndex++) 
     { 
     float Xvalue = m_pd.pp[iRowIndex].X; 
     float Yvalue = m_pd.pp[iRowIndex].Y; 
     SAP.Add(new PointF(Xvalue, Yvalue)); 

     if (Yvalue == LeftIntersectionPoint.Y) 
     { 
      pp.X = Xvalue; 
      pp.Y = Yvalue; 
      continue; 
     } 

     if (Xvalue >= rip.X) 
     { 
      Xvalue = rip.X; 
      SAP[SAP.Count - 1] = new PointF(rip.X, rip.Y); 
     } 

     if (Xvalue == rip.X) 
     { 
      break; 
     } 

     pp.X = Xvalue; 
     pp.Y = Yvalue; 
     } 

     double ecll = Getll(Location1_X, Location1_Y, rip.X, rip.Y); 

     Messagebox.Show(Convert.ToString(ec11)); 
     txtLength.Text = ll.ToString("0.00"); 
    } 
} 
+0

现在是了解如何使用所选工具集的调试器的时候了。 – nvoigt

+0

@nvoigt - 我正在使用VS2017 - 我已经使用了调试器和立即窗口,并将问题跟踪到Location1_X&Location1_Y,当n被更改时不会更改值。但我不明白为什么不。 –

+2

它们被设置在一个点上。你可以在那里放置一个断点。他们似乎不依赖'n',你为什么期望他们改变?此时'tp_x'和'tp_y'将始终为零。 – nvoigt

回答

2

我觉得这更多的是基于什么是怎么回事评论,但我种的需要代码部分解释这更好,我相信。

让我们从你的观点,宽度等简化掉我想我们都同意,n为从未在函数中使用,所以让我们做一个类似的例子:

所以我我写了一个功能,增加了1至1

var newNum = 1 + 1; 

它做什么预期,将newNum 2,但让我们说,我想,使其在NUMS加1号(从原始功能),以加强它:

int start = 2; 
int end = 10; 

int[] nums = Enumerable.Range(start, end - start).ToArray(); 

但如果我尝试重用我的直接功能:

foreach (int n in nums) 
{ 
    var newNum = 1 + 1; 
} 

每一个传球,我总是将不得不newNum设置为2,因为我没有使用的变量。

我应该做的是这样写:

foreach (int n in nums) 
{ 
    var newNum = 1 + n; 
} 

所以根据你的2至10,我应该看到newNum〜11设置为3在不同迭代。

0

'Foreach'循环中的每次迭代都将一个新值赋给'n'。 但是在循环体中,这个值(n)在计算中的任何地方都没有使用(除非我错过了某些东西)。所以,这些计算结果当然总是一样的。

只要你有“N”中的一些calclations,结果会改变......

+0

,但在我修改代码以包含foreach循环之前,单个变量(我更改为数组)的值未用于计算rip.x&rip。年。这就是为什么我没有把它包含在我的修改中。 –

+0

但是现在写的方式,除了只说“吐出结果n次”之外,您并没有使用nums/n – Robert

+0

如果单个变量对计算没有影响,为什么您会期望几个不同的值该变量来改变结果? –