如何知道哪个迭代是foreach File.ReadLines的最后一行

时间:2015-03-08 20:35:42

标签: c# .net foreach .net-4.5

如何知道哪个迭代是foreach File.ReadLines

的最后一行

这里是示例循环

foreach (var vrLine in File.ReadLines(vrItem))
{

}

我想使用ReadLines,因为有些文件有数百万行

但是我还需要知道最后一次迭代

谢谢

c#.net 4.5.2 c#5

2 个答案:

答案 0 :(得分:1)

我会做如下的事情:

var lines = File.ReadLines(vrItem);

var last = lines.LastorDefault();

foreach(var line in lines){

}

如果有的话,这会给你最后一行。但是,如果集合很大,为了获得最后一个集合,您将迭代集合,这将花费您的性能。

您也可以在不使用LastorDefault的情况下执行此操作,如下所示:

string lastLine = string.Empty;
foreach(var line in File.ReadLines()){


   lastLine = line;
}

// Here you have last line, ultimately in one run. 
// However, here you are out of the loop. Not sure if this is what you want. 

旧时尚的方式是:

int i;

var lines = File.ReadLines(vrItem);
var linecount = lines.Count();

for (i = 0; i < linecount; i++) {

     if (i == linecount - 1) {
           // this is the last item
     }
}

但是,对于非常大的文件,Count非常渴望,因此它将遍历集合。这也很贵。

答案 1 :(得分:1)

事先通过LastorDefault()获取最后一行并不好,因为它会迭代整个集合以找到最后一项。因此,您枚举IEnumerable两次。

但是,您可以放弃foreach循环并手动使用迭代器并避免此成本。类似的东西:

using (var enumerator = File.ReadLines().GetEnumerator())
{
    enumerator.MoveNext(); // TODO: Check result
    var current = enumerator.Current;
    while(true)
    {
        if(enumerator.MoveNext())
            // current is a Normal item
        else
        {
            // current is the last item
            // do your special thing and then exit the loop
            break;
        }
        current = enumerator.Current;
    }
}

您可能需要对只有一个项目的空集合和集合进行更多错误检查。