请问有人能解释一下如何在LINQ中读取文本文件的前十行吗?
使用StreamReader的代码:
using (var reader = new StreamReader(fileName))
{
string ListLines = "";
for (int i = 0; i < 10; i++)
{
ListLines[i] = reader.ReadLine();
}
}
return ListLines;
请问有人能解释一下如何在LINQ中读取文本文件的前十行吗?
使用StreamReader的代码:
using (var reader = new StreamReader(fileName))
{
string ListLines = "";
for (int i = 0; i < 10; i++)
{
ListLines[i] = reader.ReadLine();
}
}
return ListLines;
您可以使用:
var lines = File.ReadLines(path).Take(10));
使用 ReadLines
而不是 ReadAllLines
,可以从文件中流式传输数据,而不是将整个文件读入内存。如果你仍在使用 C# 3.5 而不是4(当ReadLines
被添加时),你可以使用以下实现:
public static IEnumerable<string> ReadLines(string filename)
{
using (TextReader tr = new StreamReader(filename))
{
string nextLine = tr.ReadLine();
while (nextLine != null)
{
yield return nextLine;
nextLine = tr.ReadLine();
}
}
}
Take
调用,它最终只会读取前 10 行。一个简单的方法是使用我的方法,在每次读取行后添加 Console.WriteLine
并查看打印出多少行。 - ServyToArray
或ToList
将所有数据读取进来。对于只有10行的情况,这样做是可取的。另外可能会将整个东西放入一个foreach
循环中。这意味着同一时间内最多只需要保留一行在内存中。如果你要处理大量数据,那么可能需要这样做。不过如果这样做,你正确地指出,在处理过程中文件将被锁定。 - ServyIEnumerable<string>
的延迟执行特性,但没有提到另一个有趣的方面。如果你多次迭代这个 IEnumerable,它会每次重新打开和遍历文件行;根据你的需求,这可能非常理想(例如,追踪日志文件)或非常烦人。很好的回答。 - devgeezer你的代码已经很优化,可以达到目标:
var list = new List<string>();
using (var reader = new StreamReader(fileName))
{
for (int i = 0; i < 10; i++)
{
list.Add(reader.ReadLine());
}
}
return list;
或者
using (var reader = new StreamReader(fileName))
{
for (int i = 0; i < 10; i++)
{
yield return reader.ReadLine();
}
}
或者
var r = File.ReadLines(fileName)
.Take(10) // limit to first 10
.ToArray(); // materialize, if needed
return lines;
} // 这是我尝试调用的函数,但它没有读取任何行
- Rushabh ShahToArray()
函数然后 - abatishchevLINQ 风格:
using (var textReader = File.OpenText(fileName))
{
return Enumerable.Range(1, 10).Select(i => textReader.ReadLine());
}
ReadLines
,那么“Take”就可以了。 - Servyusing
块之外,因此在第一次尝试读取行时,文件将被关闭。 - ServyReadAllLines
了?我知道我没有,而且我也没有看到其他人在这里的评论中提到它。我特别提到了 ReadLines
,它可以正确地推迟执行。 - Servy你可能会对这个感兴趣 :)
using (var reader = new StreamReader(filename))
{
return (from p in Enumerable.Range(0, 10) select reader.ReadLine()).ToList();
}