如何在文件上使用LINQ获取行数

时间:2018-09-06 12:54:56

标签: c# linq

到目前为止,我有以下代码:

var lines = from rawLine in File.ReadLines(readFolderFile, Encoding.Default) where !string.IsNullOrEmpty(rawLine) && !string.IsNullOrEmpty(rawLine.Trim(';')) select rawLine;

但是现在我还需要在IEnumerable的第一个“列”中增加行数。我试图从其他遇到或多或少相似的问题的人那里适应过来,但是到目前为止还没有成功。

我尝试了“解决方案”,例如: How do you add an index field to Linq resultsGet record's row number using Linq  和其他一些。我确实不明白,我需要某种索引,但是我不知道该在哪里添加我的.Select(()=> )

我尝试过的并且不起作用的是:

var lines = (from rawLine in File.ReadLines(readFolderFile, Encoding.Default) where !string.IsNullOrEmpty(rawLine) && !string.IsNullOrEmpty(rawLine.Trim(';'))
            select rawLine).Select((rawLine, index) =>  index++, rawLine);

2 个答案:

答案 0 :(得分:2)

您确实需要使用Select,然后才可以存储索引。

var lines = File.ReadLines(readFolderFile, Encoding.Default)
    .Where(x => !string.IsNullOrEmpty(rawLine) && !string.IsNullOrEmpty(rawLine.Trim(';')))
    .Select((x, i) => new
    {
        Line = x,
        Index = i
    }
    .ToList();

答案 1 :(得分:2)

查询语法无法为索引提供Select(和Where)的重载。因此,您需要使用方法语法。

如果您还想计算空行但不将其包括在结果中,请在Where之前选择匿名类型,否则在以下位置:

var linesAndLineNumbers = File.ReadLines(readFolderFile, Encoding.Default) 
   .Select((line, index) => new { Line = line.Trim(';'), LineNumber = index + 1 })
   .Where(x => !String.IsNullOrWhiteSpace(x.Line));
  

有没有办法,我可以得到结果为Line = {Line =   “ LineNumer; colum1; colum2; columnX ...”}

确定:

var lines = File.ReadLines(readFolderFile, Encoding.Default) 
   .Select((line, index) => new { Line = line.Trim(';'), LineNumber = index + 1 })
   .Where(x => !String.IsNullOrWhiteSpace(x.Line))
   .Select(x => $"{x.LineNumber};{x.Line};");