【问题标题】:Getting last two rows in a text file获取文本文件中的最后两行
【发布时间】:2011-12-20 22:02:41
【问题描述】:

所以我正在这样的文本文件中创建一个行列表:

var lines = File.ReadAllLines("C:\\FileToSearch.txt")
                .Where(x => !x.EndsWith("999999999999"));

并像这样循环遍历这些行

foreach (var line in lines)
{ 
    if (lineCounter == 1)
    {
        outputResults.Add(oData.ToCanadianFormatFileHeader());
    }
    else if (lineCounter == 2)
    {
        outputResults.Add(oData.ToCanadianFormatBatchHeader());
    }
    else
    {
        oData.FromUsLineFormat(line);
        outputResults.Add(oData.ToCanadianLineFormat());

    }
    lineCounter = lineCounter + 1;
    textBuilder += (line + "<br>");
}

类似于我访问前两行我想分别访问最后一行和倒数第二行

【问题讨论】:

  • 我建议进行编辑,将 C# 标记添加到此。这是一个关于使用 C# 处理文本文件的问题 - asp.net 并没有真正参与进来。

标签: c# asp.net linq


【解决方案1】:

在这里您可以再次利用 LINQ:

var numberOfLinesToTake = 2;
var lastTwoLines = lines
     .Skip(Math.Max(0, lines.Count() - numberOfLinesToTake))
     .Take(numberOfLinesToTake);

var secondToLastLine = lastTwoLines.First();
var lastLine = lastTwoLines.Last();

或者,如果您想单独检索它们:

var lastLine = lines.Last();
var secondToLastLine = 
    lines.Skip(Math.Max(0, lines.Count() - 2)).Take(1).First();

我在末尾添加了.First(),因为.Take(1) 将返回一个包含一个项目的数组,然后我们用First() 抓取它。这可能可以优化。

同样,您可能想熟悉一下 LINQ,因为它有时可以真正节省时间。

【讨论】:

  • 只是出于好奇,.Take() 在这里真的有必要吗? .Skip() 不会返回除最后两个 anwyay 之外的所有内容吗?
  • @KileyNaro yes .Skip() 将返回所需的一切。我添加了.Take() 以使概念更加明确。在我的第二个示例中,.Take(1) 绝对是必需的。
【解决方案2】:

这是在不合适时使用 var 的问题之一。

ReadAllLines 返回一个字符串数组:string[]

你可以从最后得到数组的长度和索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2013-08-29
    • 2010-09-28
    • 2013-06-26
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多