2011-10-10 61 views
1

我一直在努力工作几个小时我到了我正在工作的最后一块。我需要弄清楚如何限制循环从文本行定义的范围中取值。像1-5线,然后6-10等。C#使用文本文件

TextReader tr = new StreamReader("values.txt"); 
     for (int i = 0; i <= 5; i++) 
     { 
      for (int a = 0; a <= 5; a++) 
      { 
       line = tr.ReadLine(); 
       **while ((line = tr.ReadLine()) != null)** 
        for (a = 0; a <= 5; a++){ 
         ln = tr.ReadLine(); 
         if (ln != null){ 
          value = int.Parse(ln); 
          if (value > max) 
           max = value; 
          if (value < min) 
           min = value;} 
        } 
       Console.WriteLine(tr.ReadLine()); 
       if (i % 5 == 0) 
        Console.WriteLine("The max is" + max); 
       if (i % 5 == 0) 
        Console.WriteLine("The min is" + min); 
       if (i % 5 == 0) 
        Console.WriteLine("-----First 5"); 
      } 

我准备好睡觉,但不想失眠。任何推动正确的方式将不胜感激。

+1

我可以在你的代码中看到许多错误... 1)你的内循环正在改变外循环的变量'a'。 2)3条if条件相同。关于您的要求:您可以按照'Jamiec' – NaveenBhat

回答

5

你可以做到这一点很容易地使用LINQ的SkipdocsTakedocs方法。刚读使用File.ReadAllLinesdocs然后跳过并采取必要的文字:

var lines = File.ReadAllLines("values.txt").Skip(5).Take(5); 
//lines now has lines 6-10 

如果你这样做多次,我建议拆分这成文件访问和LINQ:

var allLines = File.ReadAllLines("values.txt") 
var lines6To10 = allLines.Skip(5).Take(5); 

... // Later on 

var lines21To25 = allLines.Skip(20).Take(5) 

至于其余的代码..看起来你试图从行中找到最小/最大值,它应该只包含整数。

var min = int.MaxValue; 
var max = int.MinValue; 
foreach(var line in lines) 
{ 
    var value = int.Parse(line); 
    if(value > max) 
     max = value; 
    if(value < min) 
     min = value; 
} 

这可以看出,在线路例如:http://rextester.com/rundotnet?code=SHP19181(注意装载数的不同方式,如从一个文件rextester着负载的原理是,虽然同)

+0

建议的方式进行多次调用。我将首先阅读所有行并将它们保存在列表中,然后使用linq跳过并执行 - 因此您没有太多文件操作。 –

+0

@Felix - 好点,回答更新。 – Jamiec

0

如果你想使用StreamReader(例如,因为文件的大小预计会很大),你可以做这样的:

using (TextReader tr = new StreamReader("values.txt")) 
{ 
    string currentLine = null; 

    do 
    { 
     Console.WriteLine("processing set of 5 lines"); 

     for (int i = 0; i < 5; i++) 
     { 
      currentLine = tr.ReadLine(); 
      if (currentLine == null) 
      { 
       break; 
      } 

      Console.WriteLine("processing line {0} of 5", i); 
      // your code goes here: 
     } 

    } while (currentLine != null); 
} 

编辑:你应该使用内您的StreamReader 10(代码更新)。

+0

这对于0到5行很好,但OP会如何处理'x'行到'y'。说第20 - 25行。 – Jamiec

+0

@Jamiec:嗯,OP要求“在文本行上定义响度”,这可以通过您的回答更好地解决。 **但是,他还要求“像1-5行,然后是6-10等”,这可以通过StreamReader方法很好地实现。 – Stephan