从文本文件创建字典然后访问它

时间:2017-06-29 14:56:04

标签: c# visual-studio dictionary

我正在建立一个程序。 它使用以下格式{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

关键时刻很少:

  1. 它必须非常快。通常会同时读取10-15个数据文件,并且每个文件都会访问多次字典。
  2. 如果可能,没有LINQ。
  3. 现在我跟着以下:

    1. File.ReadAllText()方法似乎对我来说最快。
    2. 使用拆分(&#39 ;;')和拆分(':')获取条目。
    3. Dictionary <string, string>。我使用字符串类型的原因是,如果使用Split()函数从文本数据中读取将更快。
    4. 什么是最佳解决方案?

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

1 个答案:

答案 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为你的优势