我有一个文本文件,其中包含300,000个单词的列表以及它们出现的频率。每行的格式为Word:FequencyOfOccurence。 我希望可以从C#代码中访问此信息。我不能硬编码列表,因为它太长了,我不知道如何从服务器上的文件访问它。理想情况下,我理想情况下只有在使用时才能下载信息(节省带宽)但这不是一个高优先级,因为文件不是太大而且互联网速度总是在增加。 它不需要用于绑定。 一旦项目建成,就不需要编辑信息。
答案 0 :(得分:2)
这是另一种选择。压缩文件并将其粘贴在应用程序XAP旁边的clientBin文件夹中。然后在应用程序中需要内容的位置执行以下操作: -
public void GetWordFrequencyResource(Action<string> callback)
{
WebClient client = new WebClient();
client.OpenReadAsync += (s, args) =>
{
try
{
var zipRes = new StreamResourceInfo(args.Result, null)
var txtRes = Application.GetResourceStream(zipRes, new Uri("WordFrequency.txt", UriKind.Relative));
string result = new StreamReader(txtRes.Stream).ReadToEnd();
callback(result);
}
catch
{
callback(null); //Fetch failed.
}
}
client.OpenReadAsync(new Uri("WordFrequency.zip", UriKind.Relative"));
}
用法: -
var wordFrequency = new Dictionary<string, int>();
GetWordFrequencyResource(s =>
{
// Code here to burst string into dictionary.
});
// Note code here is asynchronous with the building of the dictionary don't attempt to
// use the dictionary here.
上面的代码允许您以高效的zip格式存储文件,但不能在XAP本身中存储。因此,您可以按需下载它。它利用了XAP 一个zip文件这一事实,因此可以在zip文件中使用旨在从XAP文件中提取资源的Application.GetResourceStream
。
KeyValuePair<string, int>
,但创建一个自定义集合类型,将它们保存在数组或List
中,然后使用一些二进制搜索方法对其进行索引。
答案 1 :(得分:0)
您可以在服务器端创建一个WCF服务,该服务将数据发送到Silverlight应用程序。一旦检索到信息,就可以将其缓存在客户端内部。这是从Silverlight调用WCF服务方法的an example。
另一种可能性是将文本文件嵌入到部署到客户端的Silverlight程序集中:
using (var stream = Assembly.GetExecutingAssembly()
.GetManifestResourceStream("namespace.data.txt"))
using (var reader = new StreamReader(stream))
{
string data = reader.ReadToEnd();
// Do something with the data
}
答案 2 :(得分:0)
根据您的评论,如果您需要拥有非常薄的服务器层,可以下载单词列表文件。包含Silverlight应用程序的XAP文件只不过是一个ZIP文件,其中包含Silverlight客户端层的所有引用文件。尝试将单词列表添加为编译到XAP中的内容,并查看文件的大小。文本通常压缩得很好。但是,一般情况下,您希望与用户保持对应用程序消耗的内存的友好程度。将大量文本文件加载到内存中,除了应用程序中所需的所有内容之外,还可以使您的应用程序成为资源耗尽的。
一般来说,更好的做法是调用Web服务。该服务可以执行您需要的任何查找逻辑。这是一篇快速搜索的博客文章,应该可以帮助您入门:(这是为SL2编写的,但应该对SL3应用相同的内容。)
Calling web services with Silverlight 2
更好的方法是将列表存储在SQL Server中。查询会更容易,更快捷。