2009-05-05 52 views
0

我試圖建立一種方法來獲得給定.resx文件中的給定文本在運行時的密鑰。LINQ到resx文件?

目前,我可以打開並讀取文件(使用ResXResourceReader),但我必須使用foreach來檢查整個文件。

這可能是一個性能問題,因爲我們的一些.resx文件相當大(以2000個字符串的順序),我們可能會經常這樣做。

我想用LINQ to Objects來查詢這個,因爲我認爲where方法是相對優化的,但是我一直無法這樣做。 ResXResourceReader類有兩種方法AsQueryable()GetEnumerator(),但都不允許LINQ針對它們的結果(因此from n in reader.AsQueryable() where失敗)。

我如何LINQ對ResXResourceReader提供的東西,還是它值得的時間?

回答

2

下面的代碼返回一個IEnumerable對象,它允許您使用LINQ查詢的資源文件的內容:

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

我已經接受了這一點,因爲它的工作原理,以及它最正確回答我的問題立即。但是,我將考慮其他答案,並且我們可能不會最終實際使用它。 – Jeff 2009-05-05 21:32:46

1

你是否考慮過只做一些預處理?

你可以加載RESX文件,然後在鍵值對循環,然後存儲它們在哈希表逆轉(即哈希表中的關鍵實際上是資源的價值,和值在哈希表中是資源的關鍵)。然後,value-> key的翻譯將會很快。唯一關心的是你如何處理重複項(具有相同值的多個資源)。

1

這不是真的值得你花時間。 LINQ沒有任何方法可以比你更有效地搜索你的.resx文件。根據內存使用情況以及是否緩存數據對您有意義,您最好將整個文件讀入Dictionary<TKey,TValue>並以這種方式進行查找。

你當然可以創建自己的tuplet對象來存儲一個鍵/值對,並將整個文件讀入這些列表中,然後允許LINQ將對象做你的查詢,但這不會是與Dictionary一樣快,並且需要更多的開銷。