LINQ에서 resx 파일로?
-
05-07-2019 - |
문제
나는 주어진 텍스트의 특정 부분에 대한 키를 얻는 방법을 구축하려고 합니다. .resx
런타임 시 파일.
현재 파일을 열고 읽을 수 있습니다. ResXResourceReader
) 하지만 나는 foreach
전체 파일을 검토합니다.
이는 성능 문제일 수 있습니다. .resx
파일은 상당히 크며(문자열 2000개 정도) 이 작업을 자주 수행할 수 있습니다.
나는 이것을 쿼리하기 위해 LINQ to Objects를 사용하고 싶습니다. where
방법은 상대적으로 최적화되어 있지만 그렇게 할 수 없었습니다.그만큼 ResXResourceReader
클래스에는 두 가지 메소드가 있습니다 AsQueryable()
그리고 GetEnumerator()
, 하지만 그 결과에 대해 LINQ를 허용하지 않습니다(그래서 from n in reader.AsQueryable() where
실패).
에서 제공한 항목에 대해 LINQ를 수행하려면 어떻게 해야 합니까? ResXResourceReader
, 아니면 시간을 들일 가치가 있나요?
해결책
다음 코드는 LINQ를 사용하여 리소스 파일의 내용을 쿼리 할 수있는 ienumerable 객체를 반환합니다.
ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();
다른 팁
일부 전처리 작업을 고려해 보셨나요?
Resx 파일을 로드한 다음 키-값 쌍을 반복하여 저장할 수 있습니다. 반전 해시 테이블에서(예:해시 테이블의 키는 실제로 리소스의 값이고, 해시 테이블의 값은 리소스의 키입니다.그러면 value->key의 번역이 빨라질 것입니다.유일한 관심사는 중복(동일한 값을 가진 여러 리소스)을 처리하는 방법입니다.
이것은 실제로 당신의 시간의 가치가 없습니다. LINQ에는 .RESX 파일을 가능한 것보다 더 효율적으로 검색 할 수있는 수단이 없습니다. 메모리 사용법과 데이터 캐싱이 귀하에게 적합한 지 여부에 따라 전체 파일을 Dictionary<TKey,TValue>
그리고 당신의 조회를 그런 식으로 수행합니다.
물론, 나만의 Tuplet 객체를 만들어 키/값 쌍을 저장하고 전체 파일을 이들 목록으로 읽은 다음 LINQ에서 쿼리를 수행하도록 허용 할 수 있지만 이것은 빠르지는 않습니다. Dictionary
더 많은 오버 헤드가 필요합니다.