C# 如何在StreamReader中读取不为空的文件行

C# 如何在StreamReader中读取不为空的文件行,c#,asp.net,memory-management,C#,Asp.net,Memory Management,我想检查文件的行数是否超过20行(例如),然后阻止用户上载文本文件,以便只在这是我的代码时读取文件 using (Stream stream = fileUploadBatch.FileContent) { stream.Seek(0, SeekOrigin.Begin); using (StreamReader streamReader = new StreamReader(stream)) { strin

我想检查文件的行数是否超过20行(例如),然后阻止用户上载文本文件,以便只在这是我的代码时读取文件

    using (Stream stream = fileUploadBatch.FileContent)
    {
        stream.Seek(0, SeekOrigin.Begin);
        using (StreamReader streamReader = new StreamReader(stream))
        {
            string line = null;
            List<string> fileLines = new List<string>();
            while (!streamReader.EndOfStream && fileLines.Count < 50)
            {
                line = streamReader.ReadLine();
                if(strig.IsNullOrEmpty(line))
                    return;
                fileLines.Add(line);                          
             }

             // do something with list
        }
    }
使用(Stream=fileUploadBatch.FileContent)
{
stream.Seek(0,SeekOrigin.Begin);
使用(StreamReader StreamReader=新StreamReader(stream))
{
字符串行=null;
列表文件行=新列表();
而(!streamReader.EndOfStream&&fileLines.Count<50)
{
line=streamReader.ReadLine();
if(strig.IsNullOrEmpty(行))
返回;
文件行。添加(行);
}
//用列表做些什么
}
}
这是一种不好的做法,因为
streamReader.ReadLine()的结果将赋值给行变量并产生内存问题(字符串是不可变的)

所以我想在列表中添加不空行,而不存储行变量

您能更具体地说明您担心的内存问题吗?这是一个很小的流,整个块被包装到一个using语句中(并将尽快处理),并且不清楚“不可变字符串”如何影响任何内存;它不过滤。我不知道还有其他读卡器机制可以做到这一点。即使它会过滤,它也必须先为新行分配内存,然后才能查看是否应该跳过该行。也,我同意这种情况是如此的微不足道,你们不必担心。每次我们在分配内存中的新空间时,将一些字符串分配到字符串变量中,字符串变量的指针将引用新空间。假设上传文件的行号超过10000,那么内存中有10000个空间,仅用于检查null或null空我担心如果我的网站的最终用户使用这个网页与此代码非常多,你可以打破while循环一旦你读了超过20个非空白行,以避免时间和内存将需要阅读一个非常大的文件。还要注意,string是一种引用类型,因此您正在将对该字符串的引用添加到列表中,而不是该字符串的副本。唯一改进(稍微改进)的方法是从读取循环内部抛出。现在,您读取所有100000行,然后如果计数>20,则抛出。在循环内部进行检查,这将使它很快中止(特别是在很少或没有空行的情况下)。您能否更具体地说明您担心的内存问题?这是一个很小的流,整个块被包装到一个using语句中(并将尽快处理),并且不清楚“不可变字符串”如何影响任何内存;它不过滤。我不知道还有其他读卡器机制可以做到这一点。即使它会过滤,它也必须先为新行分配内存,然后才能查看是否应该跳过该行。也,我同意这种情况是如此的微不足道,你们不必担心。每次我们在分配内存中的新空间时,将一些字符串分配到字符串变量中,字符串变量的指针将引用新空间。假设上传文件的行号超过10000,那么内存中有10000个空间,仅用于检查null或null空我担心如果我的网站的最终用户使用这个网页与此代码非常多,你可以打破while循环一旦你读了超过20个非空白行,以避免时间和内存将需要阅读一个非常大的文件。还要注意,string是一种引用类型,因此您正在将对该字符串的引用添加到列表中,而不是该字符串的副本。唯一改进(稍微改进)的方法是从读取循环内部抛出。现在,您读取所有100000行,然后如果计数>20,则抛出。在循环内部执行该检查,这将使它很快中止(特别是在很少或没有空行的情况下)。