gpt4 book ai didi

c# - 按顺序获取文件中行的最佳方法?

转载 作者:行者123 更新时间:2023-11-30 20:53:11 26 4
gpt4 key购买 nike

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

int[] input = { 100, 50, 377, 15, 26000, 5000, 15000, 30, ... };
string output = "";
for (int i = 0; i < input.Length; i++)
{
output += File.ReadLines("C:\\file").Skip(input[i]).Take(1).First();
}

string[] lines = File.ReadAllLines("C\\file");

int[] input = { 100, 50, 377, 15, 26000, 5000, 15000, 30, ... };
string output = "";
for (int i = 0; i < input.Length; i++)
{
output += lines[input[i]];
}

我想要获取的行需要按输入数组排序。

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

第二种方式,我只需要读取一次文件,但必须做一个数组,数据量很大。

有什么方法可以让线条更好?谢谢!

最佳答案

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

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 行,并且文件行只会被枚举一次。

关于c# - 按顺序获取文件中行的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com