Как получить номер строки в цикле Foreach из массива чтения? - PullRequest
0 голосов
/ 12 декабря 2010

Программа помогает пользователям анализировать текстовый файл, группируя определенную часть текстовых файлов в массив «section».

Таким образом, вопрос заключается в том, есть ли какие-либо методы для определения номеров строк / позиций в массиве? Программа использует цикл foreach для чтения массива «section».

Может кто-нибудь посоветуете пожалуйста коды? Спасибо!

namespace Testing
{
class Program
{
    static void Main(string[] args)
    {
        TextReader tr = new StreamReader(@"C:\Test\new.txt");

        String SplitBy = "----------------------------------------";

        // Skip 5 lines of the original text file
        for(var i = 0; i < 5; i++) 
        { 
            tr.ReadLine();
        }

        // Read the reststring 

        String fullLog = tr.ReadToEnd();

        String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);

        //String[] lines = sections.Skip(5).ToArray();

        int t = 0;

        // Tried using foreach (String r in sections.skip(4)) but skips sections instead of the Text lines found within each sections
        foreach (String r in sections)
        {
            Console.WriteLine("The times are : " + t);

            // Is there a way to know or get the "r" line number?
            Console.WriteLine(r);
            Console.WriteLine("============================================================");
            t++;
        }
    }
}
}

Ответы [ 6 ]

3 голосов
/ 12 декабря 2010
Цикл

A foreach не имеет счетчика циклов. Вы можете сохранить свой счетчик:

int number = 1;
foreach (var element in collection) {
  // Do something with element and number,

  number++;
}

или, возможно, проще, использовать LINQ Enumerable.Select, который дает вам текущий индекс:

var numberedElements = collection.Select((element, index) => new { element, index });

, где numberedElements является коллекцией экземпляров анонимного типа со свойствами element и index. В случае с файлом вы можете сделать это:

var numberedLines = File.ReadLines(filename)
                        .Select((Line,Number) => new { Line, Number });

с тем преимуществом, что все это обрабатывается лениво, поэтому он будет считывать только те части файла, которые вы фактически используете.

1 голос
/ 12 декабря 2010

Насколько я знаю, нет способа узнать, какой номер строки находится в файле.Вам придется либо самим отслеживать строки, либо снова читать файл, пока не дойдете до этой строки и не посчитаете по пути.

Редактировать: Итак, вы пытаетесьполучить номер строки в массиве после того, как основная строка была разделена SplitBy?Если в этой подстроке есть определенный разделитель, вы можете разделить его снова - хотя, это может не дать вам того, что вы ищете, кроме ...

Вы по сути вернулись на круги свояone.

Что вы можете сделать, это попробовать разбить строку раздела символами новой строки.Это должно выложить его в массив, который соответствует номерам строк внутри строки.

0 голосов
/ 13 декабря 2010

У меня есть намного более простое решение вопросов после прочтения всех ответов вчера.

Поскольку строка имеет новую строку после каждой строки, можно разбить строки и преобразовать их в новый массив, который затем позволяет узнать номер строки в соответствии с положением массива.

Коды:

foreach (String r in sections) { Console.WriteLine("The times are : " + t); IList<String> names = r.Split('\n').ToList<String>(); }

0 голосов
/ 12 декабря 2010

Не так, как написан ваш код. Вы должны отслеживать номер строки для себя. Проблемные области вашего кода:

  1. В начале кода вы пропускаете 5 строк, вы должны это отследить.
  2. Используя метод Split, вы потенциально «удаляете» строки из исходного набора строк. Вы должны узнать, сколько делений вы сделали, потому что они являются исходной частью числа строк.

Вместо того, чтобы использовать ваш подход, я предлагаю выполнить синтаксический анализ и поиск в классическом индексируемом цикле for, который посещает каждую строку файла. Это, вероятно, означает отказ от удобств, таких как Split, и скорее поиск маркеров в файле вручную, например, IndexOf.

0 голосов
/ 12 декабря 2010

Ну, не используйте foreach, используйте цикл for

for( int i = 0; i < sections.Length; ++ )
{
    string section = sections[i];
    int lineNum = i + 1;
}

Вы, конечно, можете поддерживать счетчик и при использовании цикла foreach, но нет никаких причин, так как у вас естьСтандартный цикл for в вашем распоряжении, который сделан для такого рода вещей.

Конечно, это не обязательно обязательно даст вам номер строки в текстовом файле, если вы не разделитена Environment.NewLine.Вы разбиваете на большое количество символов «-», и я понятия не имею, как структурирован ваш файл.Вы, вероятно, в конечном итоге недооцените номер строки, потому что все биты «---» будут отброшены.

0 голосов
/ 12 декабря 2010

Да, вы можете использовать цикл for вместо foreach. Кроме того, если вы знаете, что файл не будет слишком большим, вы можете прочитать все строки в массив с помощью:

string[] lines = File.ReadAllLines(@"C:\Test\new.txt");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...