如何从读取数组中获取Foreach循环中的字符串行号?

时间:2010-12-12 17:10:27

标签: c# .net arrays string file-io

该程序通过将文本文件的某些部分分组为“sections”数组,帮助用户解析文本文件。

所以问题是“是否有任何方法可以找出数组中的行号/位置?”该程序使用foreach循环来读取“sections”数组。

有人可以告知代码吗?谢谢!

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 个答案:

答案 0 :(得分:3)

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是具有属性elementindex的匿名类型实例的集合。如果是文件,您可以这样做:

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

的优点是整个事物被懒惰地处理,因此它只会将文件的各个部分读入您实际使用的内存中。

答案 1 :(得分:1)

据我所知,没有办法知道你在文件中的哪个行号。您要么必须自己跟踪这些行,要么再次读取该文件,直到您到达该行并沿途计算。

修改 所以你试图在SplitBy分割主字符串后得到数组中字符串的行号? 如果该子字符串中有特定的分隔符,您可以再次将其拆分 - 但是,这可能不会为您提供所需的内容,除了...

你基本上回到了第一个方位。

你可以做的是尝试用换行符分割部分字符串。这应该将其吐出到与字符串内的行号对应的数组中。

答案 2 :(得分:0)

是的,您可以使用for循环而不是foreach。此外,如果您知道文件不会太大,您可以将所有行读入数组:

string[] lines = File.ReadAllLines(@"C:\Test\new.txt");

答案 3 :(得分:0)

好吧,不要使用foreach,使用for循环

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

当你使用foreach循环时,你当然可以维护一个计数器,但是没有理由因为你有这个标准的循环,这是为了这种事情。

当然,除非你在Environment.NewLine上拆分,否则这不会必然为你提供文本文件中字符串的行号。你分裂了大量的' - '字符,我不知道你的文件是如何构建的。您可能最终会低估行号,因为所有'---'位都将被丢弃。

答案 4 :(得分:0)

不是你的代码写的。您必须自己跟踪行号。代码中存在问题的区域:

  1. 您在代码开头跳过5行,您必须跟踪此行。
  2. 使用Split方法,您可能会从原始行集合中“删除”行。你必须知道你已经分了多少分裂,因为它们是行数的原始部分。
  3. 我建议不要采用你所采用的方法,而是在经典的索引for循环中进行解析和搜索,该循环访问文件的每一行。这可能意味着放弃像Split这样的便利,而是手动查找文件中的标记,例如{{1}}。 IndexOf

答案 5 :(得分:0)

在阅读了昨天的所有答案之后,我对这些问题有了一个更简单的解决方案。

由于字符串在每一行后面都有换行符,因此可以拆分字符串并将其转换为新数组,然后可以根据数组位置找出行号。

代码:

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