如何知道哪个迭代是foreach File.ReadLines
的最后一行这里是示例循环
foreach (var vrLine in File.ReadLines(vrItem))
{
}
我想使用ReadLines,因为有些文件有数百万行
但是我还需要知道最后一次迭代
谢谢
c#.net 4.5.2 c#5
答案 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;
}
}
您可能需要对只有一个项目的空集合和集合进行更多错误检查。