2011-10-10 32 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