我正在建立一个程序。 它使用以下格式{Index:Value}存储在文本文件中的数据。例如:
1:10,86;
2:11,65;
3:13,32;
4:13,53;
5:13,93;
...
1500:1565,99;
每个文件都有粗糙的1490-1500行。
我需要在字典中读取这些文件,并通过不同的函数将其索引作为整数和Value作为double。类似的东西:
Data.ByIndex((integer) 3) - returns (double) 13,32
现在按价值获得指数会更加棘手:
Data.ByClosestValue((double) 12,0) - returns (integer) 2
Data.ByClosestValue((double) 13) - returns (integer) 3
Data.ByClosestLower((double) 13,5) - returns (integer) 3
Data.ByClosestHigher((double) 13,5) - returns (integer) 5
关键时刻很少:
现在我跟着以下:
Dictionary <string, string>
。我使用字符串类型的原因是,如果使用Split()函数从文本数据中读取将更快。什么是最佳解决方案?
更新:大多数人会建议将数据存储在数据库中,我同意这是最好的解决方案,但不幸的是我无法控制这些数据文件。这些数据文件是在另一个程序中形成的,严格要求它必须由人通过记事本或其他任何东西编辑。
答案 0 :(得分:1)
我非常相信将文件读取到内存,将值解析为int和double(因此在使用之前将它们存储到IDictionary<int, double>
将是这种情况下最有效的解决方案。您可以使用SortedDictionary来拥有它更有效。你的ByIndex()函数将是微不足道的:
double ByIndex(int index)
{
double value = 0.0;
Data.TryGet(index, out value);
return value;
}
其他功能:
int ByClosestValue(double val)
{
int closest = -1;
foreach(var v in Data)
{
if (Math.Round(v.Value, 0) == Math.Round(val, 0)
{
closest =v.Key;
break;
}
}
return closest;
}
ByClosestLower和ByClosesHigher几乎相同 - 您只需要调用Floor()
和Ceiling()
而不是Round()
。
你也可以使用这个:Efficiently find nearest dictionary key为你的优势