2012-04-27 252 views
0

我必须写的内容在此格式在foreach循环运行的for循环

somename1 value1 value2 value1 value2 .... 
somename2 value1 value2 value1 value2 .... 
somename3 value1 value2 value1 value2 .... 
somename4 value1 value2 value1 value2 .... 
somename5 value1 value2 value1 value2 .... 

VALUE1和value2是一个点的x和y坐标的一部分,所以这个我有创建了一个类:

class Points 
{ 
string name; 
double[] X; 
double[] Y; 
} 

class PointsCollection 
{ 
    List<Points> aPoints 
} 

//now when accessing the PointCollection 
foreach(Points aPoints in PointsCollection) 
{ 
    stream.Write(aPoints.Name) 
    //now i have to write the value1 and valud2 

} 

possible code 

//now when accessing the PointCollection 
foreach(Points aPoints in PointsCollection) 
{ 
    stream.Write(aPoints.Name) 
    int length1 = aPoints.Real; 
    int length2 = aPoints.Imag; 
    for(int i = 0 ; i < length1; i++) 
    { 
      stream.Write(aPoints.Real[i]); 
      stream.Write(","); 
      stream.Write(aPoints.Imag[i]); 

    } 
    stream.WriteLine(); 

} 

问题:在foreachloop中使用循环是否正确?

+0

可能会将内部循环移动到不同的方法,使它看起来整齐。 – Zenwalker 2012-04-27 07:59:12

回答

0

是的,除了我会确保length1length2正在着手面前一律平等;)

你也可以这样做:

foreach(Points aPoints in PointsCollection) 
{ 
    stream.Write(aPoints.Name) 
    foreach (var complexNumber in aPoints.Real.Zip(aPoints.Imag, 
     (real, imag) => new { Real = real, Imag = imag })) 
    { 
     stream.Write(complexNumber.Real); 
     stream.Write(","); 
     stream.Write(complexNumber.Imag); 

    } 
    stream.WriteLine(); 
} 

但这仅仅是炫耀并没有按”真的让你的代码更清晰。我想你的版本是更好,更重要的是...

哦,并尝试运行代码,因为你的格式是关闭的重击,你需要先鼓捣了一点;)

5

是,在foreach中嵌套for循环(或foreach for)是正确的!

1

在foreach循环中使用for循环是否正确?

循环内的循环 - “嵌套循环” - 是一种常规方法。像C#这样的语言允许您将控制结构(循环,if,...)自由嵌套在一起。没有这个问题很难解决。

唯一的危险是让功能变得冗长难以理解和维护:解决方案是将内部控制结构分解为自己的方法。

0

我将使用StringBuilder进行优化,并且只对每个循环的stream.Write()进行一次调用。
除此之外,读取Real数组的长度时会出现一些错误,但我想这只是SO上的一个输入错误。

StringBuilder sb = new StringBuilder(); 
//now when accessing the PointCollection 
foreach(Points aPoints in PointsCollection) 
{ 
    sb.Clear(); 
    sb.Append(aPoints.Name); 
    int length1 = aPoints.Real.Lenght; // Get the length of Real array 
    // int length2 = aPoints.Imag; // Not needed??? 
    for(int i = 0 ; i < length1; i++) 
    { 
     sb.AppendFormat("{0},{1} ", aPoints.Real[i], aPoints.Imag[i]); 
    } 
    sb.AppendLine(); 
    stream.Write(sb.ToString()); 
}