我想将世界城市存储在一个列表中,因为 Metro 应用程序没有本地数据库,但我不确定这是否可行(我找到了一个包含超过 300 万个城市的文本文件)。
我想知道他们在天气应用程序中的表现如何。由于建议的结果中没有延迟(在搜索魅力或“最喜欢的地方”屏幕中),我不认为他们使用网络服务,而且我希望我的应用程序能够提出城市列表甚至如果没有可用的连接。
任何的想法 ?
我想将世界城市存储在一个列表中,因为 Metro 应用程序没有本地数据库,但我不确定这是否可行(我找到了一个包含超过 300 万个城市的文本文件)。
我想知道他们在天气应用程序中的表现如何。由于建议的结果中没有延迟(在搜索魅力或“最喜欢的地方”屏幕中),我不认为他们使用网络服务,而且我希望我的应用程序能够提出城市列表甚至如果没有可用的连接。
任何的想法 ?
只需将其粘贴在文本文件中,按行分隔即可。这不是大量的数据 - 您可以一次将其全部保存在 RAM 中。
只为这个列表使用数据库似乎有点矫枉过正。
通过一些粗略的计算,假设每个名称大约有 20 个字符,我在大约 100MB 的城市数据区域内。对于内存中的一个列表来说,这并不是微不足道的——当然,但这并不是很多需要应对的。
您甚至可以使用Linq to Text提供程序之类的东西。
300 万个城市听起来可能很多。但这对您的 Metro 应用程序来说是不是很多?
这些是非常粗略的估计
让我们使用 20 个 Unicode 字符的平均城市名称长度。
20 * 300 万 = 6000 万个 Unicode 字符。
每个 Unicode 字符 6000 万 * 2 个字节 = 1.2 亿字节。
1.2 亿字节 / 1024 = 117,187.5 KB
117,187.5 千字节 / 1024 = 114 兆字节
~115mb 并不完全是“小”,但取决于您的其他要求 - 您可能可以处理将 150mb 加载到内存中。您可以使用您通常使用的任何 .NET 对象,例如 List 并使用 LINQ 来获取匹配的城市或其他任何东西。
这并不是说这是您唯一的选择。它可能只是一个可行的。您可以做很多非常聪明的事情来避免一次将所有内容都拉入内存;但是,如果您想消除/最小化延迟-那将是您最好的选择。
如果您需要数据库,我建议您研究 SQLite。Metro 应用程序显然无法访问 SQL Server 和其他基于 Win32 的 DBMS,但您可以尝试使用 SQLite 作为轻量级替代方案。
我们建议使用带有LinqConnect的 SQLite 数据库- Devart 的支持 SQLite 的 LINQ to SQL 兼容解决方案。您可以在我们的产品中使用 LINQ 和 ADO.NET 接口。从 4.0 版本开始,LinqConnect 支持 Windows Metro 应用程序:http: //blogs.devart.com/dotconnect/linqconnect-for-metro-quick-start-guide.html。