#c# #visual-studio #console-application #text-files
#c# #visual-studio #консоль-приложение #текстовые файлы
Вопрос:
Я работал над этим часами, я дошел до последней части того, над чем я работаю. Мне нужно выяснить, как ограничить цикл для получения значений из определенного rang в текстовых строках. Например, строки 1-5, затем 6-10 и т.д.
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) Ваш внутренний цикл for изменяет переменную внешнего цикла for
a
. 2) 3if
условия одинаковы. О ваших требованиях: вы можете сделать так, как предложеноJamiec
Ответ №1:
Вы можете легко добиться этого, используя методы LINQ Skip
docs и Take
docs. Просто прочитайте текст, используя File.ReadAllLines
документы, затем пропустите и используйте по мере необходимости:
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)
Что касается остальной части вашего кода .. похоже, вы пытаетесь найти min / max из строк, которые должны содержать только целые числа.
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 (Обратите внимание на другой способ загрузки чисел, так как rext tester не может загружаться из файла. Принцип тот же, хотя)
Комментарии:
1. для нескольких вызовов я бы сначала прочитал все строки и сохранил их в list<string>, а затем использовал linq Skip и Take — так что у вас не так много файловых операций.
Ответ №2:
Если вы хотите использовать 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 внутри a using block
(код обновлен).
Комментарии:
1. Это нормально для строк от 0 до 5, но как бы OP обрабатывал строки
x
y
. Скажем, строки 20-25.2. @Jamiec: Ну, OP запросил «определенный rang в текстовых строках», который лучше учитывается в вашем ответе. Но он также попросил » Например, строки 1-5, затем 6-10 и т. Д. «, Что может быть достигнуто с помощью этого
StreamReader
подхода.