【问题标题】:Creating dictionary from text file and then accessing it从文本文件创建字典然后访问它
【发布时间】:2017-12-03 08:39:09
【问题描述】:

我正在构建一个程序。 它使用以下格式 {Index:Value} 存储在文本文件中的数据。示例:

1:10,86;
2:11,65;
3:13,32;
4:13,53;
5:13,93;
...
1500:1565,99;

每个文件大约有 1490-1500 行。

我需要在字典中读取这些文件,并通过不同的函数将其索引作为整数访问,将值作为双精度数访问。比如:

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

有几个关键时刻:

  1. 它必须非常快。通常会同时读取 10-15 个数据文件,每个文件会多次访问字典。
  2. 尽可能不使用 LINQ。

现在我选择了以下内容:

  1. File.ReadAllText() 方法对我来说似乎是最快的。
  2. 使用 Split(';') 和 Split(':') 获取条目。
  3. Dictionary <string, string>。我使用字符串类型的原因是,如果使用 Split() 函数从文本数据中读取会更快。

最佳解决方案是什么?

更新:大多数人会建议将数据存储在数据库中,我同意这是最好的解决方案,但不幸的是我无法控制这些数据文件。这些数据文件是在另一个程序中形成的,并且有一个严格的要求,它必须可以由人类通过记事本或其他方式进行编辑。

【问题讨论】:

  • 您是否有不想使用数据库的原因?
  • 你能详细说明你为什么不想使用 linq 吗?
  • 1.数据库不是一个选项,因为数据文件是在不同的应用程序中形成的。
  • 2.我不想使用 LINQ 的原因是因为我需要我的程序在 .NET 2.0 上运行。
  • 如果你总是想用值计算,不要存储字符串,拆分和解析一次,然后将它作为正确的类型存储在字典中。

标签: c# visual-studio dictionary


【解决方案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 来发挥你的优势

【讨论】:

  • 为什么要使用 SortedDictionary?它不是最慢的字典吗?
  • 插入值时它可能会更慢(在你的情况下 1500 * 15 = 22500 个条目 - 我怀疑你会注意到),但访问它们更快(我想你的任务是访问值比插入它们更频繁)
猜你喜欢
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多