【发布时间】:2018-04-07 11:42:54
【问题描述】:
我使用 unity 和 c# 编写了一个程序,该程序使用我的 android 设备的 gps 位置,它会检测我是否在某个预定义的位置附近。 到目前为止,一切正常,程序检测到所有预定义的位置,并在我靠近它们时通知我。
我通过使用 streamreader 实现了这一点,它创建了一个字符串列表,该列表逐行读取文本文件并将其存储在检查器中的元素中。
每次 gps 位置更改时都会读取元素,使用循环到列表末尾,并检查元素是否与 gps 位置匹配。
我现在遇到的问题是我的数据库文本文件变得非常大,最终由于元素太多而出错。
文本文件格式如下
53.752 -2.481 位置 1。
51.551 -3.271 位置 2。
55.932 -4.037 位置3
等等……
数据库可能有1000个项目,其中第一个数字是纬度,第二个是经度,第三个是描述
我的问题是哈希表是否最适合此问题,如果是,我将如何将单独的项目添加到列表中。我假设纬度和经度是关键,位置是一对。
我试图找到示例,但我找到的所有信息都已添加到脚本中,即
Hashtable mytable = new Hashtable();// create a new hashtable called mytable
//add all the elements that you want in the format key followed by pair
mytable.Add(1, "Location1");
而不是从文本文件中读取信息。
感谢您的帮助。
【问题讨论】:
-
哈希不能解决文本文件大小问题。最好的解决方案是使用真实数据库而不是文本文件。你可以从 msdn 免费下载 SQL Express 来解决这个问题。
-
包含数千个项目的列表应该没有问题。搜索此列表非常高效,即使在比较每个项目的纬度和经度时,在您真正遇到性能问题之前我也不会对此进行优化。如何阅读项目以创建列表是另一个问题,但与使用哈希表无关。将列表保存在内存中对我来说似乎是合乎逻辑的解决方案,而不是每次都从数据库/文件中读取它。
-
感谢您的回复,您认为最好的方法是什么?我同意将其保存在内存中是最好的方法,而不是不断阅读它,但具体如何,我不太确定
-
只需编写一个类
Location,其属性为Latitude、Longitude和Name,然后创建一个List<Location>类型的列表。将列表填充一次并保留列表的变量,这没有什么神奇的。 -
除非我误解了这就是我所拥有的(我认为)。这是我刚刚切入公共类位置的代码的 sn-p:MonoBehaviour { public List
info = new List ();公共 int 行号;无效开始(){信息。清除();行号 = 0; StreamReader r = File.OpenText(Application.persistentDataPath + "\\" + "myreadwritefile.txt"); while (!r.EndOfStream) {string eachline = r.ReadLine();行号 ++; info.Add(每一行); } r.Close();