Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 使文件中的行按顺序排列的最佳方法是什么?_C#_File_Getline - Fatal编程技术网

C# 使文件中的行按顺序排列的最佳方法是什么?

C# 使文件中的行按顺序排列的最佳方法是什么?,c#,file,getline,C#,File,Getline,到目前为止,我知道获取文件中某些行的2种方法包含大约30000行: 或 我想要得到的行需要按输入数组排序 第一种方法,我不需要创建一个lines数组,它包含30.000个~4MB的元素,但我必须为每个输入元素重新打开文件 第二种方法,我只需要读取一次文件,但必须使用大数据创建一个数组 我有什么办法可以把台词弄清楚?谢谢! 本文介绍如何使用memorystream读取文件。您可以使用它一次缓冲文件的各个部分,也可以使用回车符作为分隔符本文介绍如何使用memorystream从文件中读取数据。您可以

到目前为止,我知道获取文件中某些行的2种方法包含大约30000行:

我想要得到的行需要按输入数组排序

第一种方法,我不需要创建一个lines数组,它包含30.000个~4MB的元素,但我必须为每个输入元素重新打开文件

第二种方法,我只需要读取一次文件,但必须使用大数据创建一个数组


我有什么办法可以把台词弄清楚?谢谢!

本文介绍如何使用memorystream读取文件。您可以使用它一次缓冲文件的各个部分,也可以使用回车符作为分隔符

本文介绍如何使用memorystream从文件中读取数据。您可以使用它一次缓冲文件的各个部分,也可以使用回车符作为分隔符

您可以创建缓冲迭代器,该迭代器将只迭代序列一次,并保持所需大小的缓冲区:

public class BufferedIterator<T> : IDisposable
{
    List<T> buffer = new List<T>();
    IEnumerator<T> iterator;

    public BufferedIterator(IEnumerable<T> source)
    {
        iterator = source.GetEnumerator();
    }

    public T GetItemAt(int index)
    {
        if (buffer.Count > index) // if item is buffered
            return buffer[index]; // return it
        // or fill buffer with next items
        while(iterator.MoveNext() && buffer.Count <= index)        
            buffer.Add(iterator.Current);
        // if we have read all file, but buffer has not enough items
        if (buffer.Count <= index)
            throw new IndexOutOfRangeException(); // throw

        return buffer[index]; // otherwise return required item
    }

    public void Dispose()
    {
       if (iterator != null)
           iterator.Dispose();
    }
}
用法:

var lines = File.ReadLines("C\\file");
using (var iterator = new BufferedIterator<string>(lines))
{
    int[] input = { 100, 50, 377 };
    for(int i = 0; i < input.Length; i++)
        output += iterator.GetItemAt(input[i]);
}

使用此示例,仅读取和缓冲文件的前377行,并且仅枚举一次文件行。

您可以创建缓冲迭代器,该迭代器仅迭代序列一次,并保持所需大小的缓冲区:

public class BufferedIterator<T> : IDisposable
{
    List<T> buffer = new List<T>();
    IEnumerator<T> iterator;

    public BufferedIterator(IEnumerable<T> source)
    {
        iterator = source.GetEnumerator();
    }

    public T GetItemAt(int index)
    {
        if (buffer.Count > index) // if item is buffered
            return buffer[index]; // return it
        // or fill buffer with next items
        while(iterator.MoveNext() && buffer.Count <= index)        
            buffer.Add(iterator.Current);
        // if we have read all file, but buffer has not enough items
        if (buffer.Count <= index)
            throw new IndexOutOfRangeException(); // throw

        return buffer[index]; // otherwise return required item
    }

    public void Dispose()
    {
       if (iterator != null)
           iterator.Dispose();
    }
}
用法:

var lines = File.ReadLines("C\\file");
using (var iterator = new BufferedIterator<string>(lines))
{
    int[] input = { 100, 50, 377 };
    for(int i = 0; i < input.Length; i++)
        output += iterator.GetItemAt(input[i]);
}

在这个示例中,只读取和缓冲文件的前377行,并且只枚举一次文件行。

也许使用流可以让您找到一个更具可伸缩性的解决方案?老实说,我认为第二个选项(在中读取整个文件)并没有太大的错误。4mb不是一个大文件,只要在您使用它之后内存被释放,那么我就采用这种方式。也许使用streams会让您找到一个更具可扩展性的解决方案?老实说,我认为第二个选项(在内存中读取整个文件)没有那么大的错误。4mb不是一个大文件,只要在你使用它之后内存被释放,那么我就这样做。谢谢!你的解决方案比我的好。一个问题:下面的答案建议我使用流阅读器。如果我使用它,然后将偏移量移动到我需要的行,这是否只是读取input[]中的行,更重要的是,读取速度更快?我是C新手,所以我不知道哪个更好。内存流只是流类,它将所有数据保存在数组中。当您需要使用流,但不想使用文件、网络或其他流资源时,它非常有用。它不能更快,然后读取项目数组和索引数组,因为它保持数组内部正常,感谢您的帮助!接受了答案:@ Tuytnk一个建议——在开始从文件中获取线之前,考虑分析你需要的最大行数。即input.Max。如果低于或远低于总行数30000,则最好使用缓冲读取。否则,只需将所有行读取到数组中,就像您在第二个选项中所做的那样,它也比MemoryStream快。是的,我的输入。与文件行数相比,Max有时可能非常小。我会在读台词之前检查一下。非常感谢。非常感谢。你的解决方案比我的好。一个问题:下面的答案建议我使用流阅读器。如果我使用它,然后将偏移量移动到我需要的行,这是否只是读取input[]中的行,更重要的是,读取速度更快?我是C新手,所以我不知道哪个更好。内存流只是流类,它将所有数据保存在数组中。当您需要使用流,但不想使用文件、网络或其他流资源时,它非常有用。它不能更快,然后读取项目数组和索引数组,因为它保持数组内部正常,感谢您的帮助!接受了答案:@ Tuytnk一个建议——在开始从文件中获取线之前,考虑分析你需要的最大行数。即input.Max。如果低于或远低于总行数30000,则最好使用缓冲读取。否则,只需将所有行读取到数组中,就像您在第二个选项中所做的那样,它也比MemoryStream快。是的,我的输入。与文件行数相比,Max有时可能非常小。我会在读台词之前检查一下。非常感谢。