我正在尝试构建一种方法来在运行时获取给定.resx文件中给定文本的密钥。

目前,我可以打开并阅读该文件(使用ResXResourceReader),但我必须使用foreach来浏览整个文件。

这可能是一个性能问题,因为我们的一些where文件相当大(大约2000个字符串),我们可能经常这样做。

我想使用LINQ to Objects来查询它,因为我假设AsQueryable()方法是相对优化的,但我一直无法这样做。 GetEnumerator()类有两个方法from n in reader.AsQueryable() where和<=>,但是不允许LINQ反对它们的结果(所以<=>失败)。

如何针对<=>提供的内容进行LINQ,还是值得花时间?

有帮助吗?

解决方案

以下代码返回一个IEnumerable对象,该对象允许您使用LINQ查询资源文件的内容:

ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();

其他提示

您是否考虑过进行一些预处理?

您可以加载Resx文件,然后遍历键值对,然后将它们颠倒存储在哈希表中(即哈希表中的键实际上是资源的值) ,并且哈希表中的值是资源的关键字)。那么值 - <!> gt;键的翻译会很快。唯一的问题是如何处理重复项(具有相同值的多个资源)。

这不值得你花时间。 LINQ没有任何方法可以比您更有效地搜索.resx文件。根据内存使用情况以及缓存数据是否对您有意义,您可能最好将整个文件读入Dictionary<TKey,TValue>并以此方式进行查找。

当然,您可以创建自己的连音符对象来存储键/值对,并将整个文件读入这些对象的列表,然后允许LINQ对象进行查询,但这不会是快速作为Dictionary并且需要更多的开销。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top