Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ从文件中读取前10行_C#_.net_Linq_File Io - Fatal编程技术网

C# 使用LINQ从文件中读取前10行

C# 使用LINQ从文件中读取前10行,c#,.net,linq,file-io,C#,.net,Linq,File Io,有人能解释一下如何在LINQ中读取文本文件的前10行吗 使用StreamReader的代码: using (var reader = new StreamReader(fileName)) { string ListLines = ""; for (int i = 0; i < 10; i++) { ListLines[i] = reader.ReadLine(); } } return ListLines; 使用(var reader=n

有人能解释一下如何在LINQ中读取文本文件的前10行吗

使用StreamReader的代码:

using (var reader = new StreamReader(fileName))
{
    string ListLines = "";
    for (int i = 0; i < 10; i++)
    {
        ListLines[i] = reader.ReadLine();
    }
}
return ListLines;
使用(var reader=newstreamreader(文件名))
{
字符串ListLines=“”;
对于(int i=0;i<10;i++)
{
ListLines[i]=reader.ReadLine();
}
}
返回列表行;

您的代码已经是实现目标的最佳代码:

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 textReader = File.OpenText(fileName))
{
    return Enumerable.Range(1, 10).Select(i => textReader.ReadLine());
}
您可以使用:

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();
        }
    }
}
公共静态IEnumerable可读行(字符串文件名)
{
使用(TextReader tr=新的StreamReader(文件名))
{
字符串nextLine=tr.ReadLine();
while(nextLine!=null)
{
收益率下线;
nextLine=tr.ReadLine();
}
}
}

请您对这一组合感兴趣:)


你试过什么了吗?把它贴上去,这样我们就可以看一看并帮助你。你试过什么?(这很简单,但听起来很可能是家庭作业,你还没有给出任何努力的迹象。如果你提供更多关于你尝试过的内容的信息,我相信你会得到有用的答案。)我尝试过使用C#-StreamReader,但我想知道是否可以使用LINQ。这可能会有所帮助;public static IEnumerable GetLine(字符串文件名){var lines=File.ReadAllLines(文件名).Take(10);return lines;}//这是我试图调用的函数,但它不读取任何内容line@RushabhShah:调用
ToArray()。通过避免读取整个文件来保持性能的聪明方法。错误检查很重要,以防文件不包含10行。@Jasd:同意,应该是这样的,只是想通过linq@abatishchev:不,当必须将所有行加载到内存中时,它仍然很简单,并且比Take(10)获得更好的性能,考虑一下大文本文件
Take
是可以的,只要您从尽可能长时间延迟文件读取的内容中提取,例如
ReadLines
。file.ReadLines()(以及您的手动实现)是否仍然读取文件中的每一行?这似乎没有解决性能问题。@itsme86不,它没有读取文件中的每一行。它延迟执行,并且由于
Take
调用,它只会读取前10行。显示这一点的一个简单方法是使用我的方法,在每个读取行之后添加一个
控制台。WriteLine
,然后查看最终打印了多少行。啊,这现在是有意义的+1.但在不确定的时间内获取资源真的那么聪明吗?如果系统获取了该文件的读锁,则只要枚举器处于活动状态,就没有人能够写入该文件。这可能要花很长时间。这是正确的吗?@Jasd您可以立即
ToArray
ToList
读取所有数据。只要10行,这将是可取的。或者,您可能会将整个内容放入
foreach
循环中。这意味着在同一时间内存中不需要超过一行。如果您正在处理大量数据,这可能是一项要求。如果您这样做,则在处理过程中文件将被锁定是正确的。
var lines = File.ReadLines(path).Take(10));
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();
        }
    }
}
using (var reader = new StreamReader(filename))
{
    return (from p in Enumerable.Range(0, 10) select reader.ReadLine()).ToList();
}