我有一个特定的文本文件:
197 17.16391215
198 17.33448519
199 17.52637986
200 17.71827453
201 17.9101692
202 18.10206387
203 18.29395854
204 18.48585321
205 18.67774788
206 18.86964255
207 19.06153722
Run Code Online (Sandbox Code Playgroud)
等等.需要说明的是:第一列(197,198,..)表示帧号,第二列(17.xxx,...)表示链接到帧号的位置,反之亦然.
现在我想在不同的数组中分隔每一行.同
string[] delimiters = new string[] {" ", "\r\n" };
string line = reader.ReadToEnd();
string[] test = line.Split(delimiters, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)
我有一个包含Textfile中所有条目的数组.但我希望所有framenumbers(第一列)在一个Array中,而在另一个第二个Array中所有位置.
我需要做的工作如下:我将得到一个位置编号(例如18.10)然后我必须在第二列的.txt文件中搜索最接近的匹配编号并返回链接的框架编号(在这种情况下为202) .我的想法是生成两个匹配的数组,在一个中搜索位置,从另一个中返回framenumber.当我在互联网上搜索了半天时,发现很多东西,比如所有的.select东西,但没有任何东西直接匹配我的问题; 但也许我此刻是愚蠢的.
所以感谢任何帮助.希望你能理解我的英语:P
在评论后编辑2,您希望每秒重复搜索24次.
首先,让我来说,如果你试图播放一组帧,那么查找列表是错误的方法.正确的方法超出了问题的范围,但实质上你想要限制顺序数据的显示.
假设值不会改变,并且您的查找是随机的,而不是顺序的.你可以试试这样的代码.
private readonly List<int> ids = new List<int>();
private readonly IList<double> values = new List<double>();
public void LoadData(string path)
{
foreach (var line in File.ReadLines(path))
{
var pair = line.Split(' ');
this.ids.Add(int.Parse(pair[0]));
this.values.Add(double.Parse(pair[1]));
}
}
public double Lookup(int id)
{
return this.values[this.ids.FindIndex(i => i >= id)];
}
Run Code Online (Sandbox Code Playgroud)
如果需要更高的性能,可以在此处使用专门的二进制搜索.
阅读后编辑并希望了解
并假设帧按递增的Id顺序排列.
double GetFrameValue(string path, int limit)
{
string [] parts;
foreach (var line in File.ReadLines(path))
{
parts = line.Split(' ');
var frameId = int.Parse[0];
if (frameId >= limit)
{
break;
}
}
return double.Parse(parts[1]);
}
Run Code Online (Sandbox Code Playgroud)
这具有明显的优点,即只在必要时读取文件而不是将其全部保存在内存中.如果你要在随机帧位置读取文件repeatley,那么Collection除非文件非常大,否则你最好将它全部加载到具有快速比较性能的文件中.
怎么样,
IEnumerable<KeyValuePair<int, double>> ReadFrames(string path)
{
foreach (var line in File.ReadLines(path))
{
var parts = line.Split(' ');
yield return new KeyValuePair<int, double>(
int.Parse(parts[0]),
double.Parse(parts[1]));
}
}
var frames = new Dictionary<int, double>(ReadFrames("yourfile.txt"));
var frameIds = frames.Keys;
var values = frames.Values;
Run Code Online (Sandbox Code Playgroud)
如评论中所述,
var frames = File.ReadLines("yourfile.txt")
.Select(line => line.Split(' '))
.ToDictionary(pair => int.Parse(pair[0]), pair => double.Parse(pair[1]));
var frameIds = frames.Keys;
var values = frames.Values;
Run Code Online (Sandbox Code Playgroud)
也应该工作.
| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |