逐行分析并存储if条件,否则忽略

Cyl*_*len 2 c# filter streamreader

我已经在这个上挖了很多东西而且找不到我正在寻找的东西.

INPUT:多行(数百,偶尔数千)ASCII文本行,范围从97个字符到500个以上.我是否要保留此数据的标准纯粹包含在前3个字符中(总是数字 - 任意值100,200和300是我感兴趣的).

所需的输出只是那些以100,200或300开头的输出,其余我可以忽略.

这就是我的streamreader,它目前输出到控制台:

using System;
using System.Collections.Generic;
using System.IO;

class Program
{
public void Do
{

    // Read in a file line-by-line, and store in a List.

    List<string> list = new List<string>();
    using (StreamReader reader = new StreamReader("File.dat"))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            list.Add(line); // Add to list.
            Console.WriteLine(line); // Write to console.
        //    Console.ReadLine();
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我希望能说出一句话

IF {
FIRST3CHAR != (100,200,300) }
then skip,
Run Code Online (Sandbox Code Playgroud)

但我不确定如何定义FIRST3CHAR类.这是将对原始数据执行的唯一过滤器.

接下来,我将根据其中包含的其他标准分析这个过滤后的数据集,但在请求任何帮助之前,我会自己给出一个镜头.

Tim*_*ter 5

此代码更具可读性,可以满足您的需求:

var allowedNumbers = new[]{ "100", "200", "300" };
IEnumerable<String> lines = File
                   .ReadLines("File.dat")
                   .Where(l => allowedNumbers.Any(num => l.StartsWith(num)));
Run Code Online (Sandbox Code Playgroud)

现在你可以枚举这些行,例如foreach:

foreach(string line in lines)
{
    Console.WriteLine(line); // Write to console.
}
Run Code Online (Sandbox Code Playgroud)

由于您想要将这些行添加到List<string>任何方面,您可以使用Enumerable.ToList而不是foreach:

List<string> list = lines.ToList();
Run Code Online (Sandbox Code Playgroud)

  • @PLB:你在哪里看到了瓶颈?请注意,[`ReadLines`](http://msdn.microsoft.com/en-us/library/dd383503.aspx)在返回结果之前不会将整个文件读入内存.有关详细信息,请参阅其文档的*备注*部分. (2认同)
  • @PLB:我假设你没有得到_deferred execution_的观点.将`Where`理解为循环中的`if`子句而不是附加循环.如上所述使用的"Any"与Marc Gravells"||"方法相同. (2认同)