LINQ إلى RESX ملف؟
-
05-07-2019 - |
سؤال
وأنا أحاول لبناء وسيلة للحصول على المفتاح للحصول على قطعة معينة من النص في ملف .resx
معين في وقت التشغيل.
وحاليا، لا أستطيع فتح وقراءة ملف (عن طريق ResXResourceReader
)، ولكن لا بد لي من استخدام foreach
للذهاب على الملف بأكمله.
وهذا يمكن أن يكون مشكلة الأداء، حيث أن بعض الملفات .resx
لدينا هي إلى حد كبير (في حدود 2000 سلاسل) ونحن يمكن القيام بذلك في كثير من الأحيان.
وأود أن استخدام LINQ إلى كائنات الاستعلام هذا، كما أفترض هو الأمثل لطريقة where
نسبيا، ومع ذلك لقد كنت غير قادر على القيام بذلك. الطبقة ResXResourceReader
ديها طريقتين AsQueryable()
وGetEnumerator()
، ولكن لا تسمح LINQ ضد نتائجها (ما فشل from n in reader.AsQueryable() where
).
وكيف يمكنني LINQ ضد شيء قدمتها ResXResourceReader
، أو غير ذلك حتى يستحق كل هذا الوقت؟
المحلول
والتعليمة البرمجية التالية بإرجاع كائن IEnumerable التي تسمح لك لاستخدام LINQ الاستعلام عن محتويات ملف الموارد:
ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();
نصائح أخرى
هل تعتبر مجرد القيام ببعض ما قبل المعالجة؟
هل يمكن تحميل الملف RESX، ثم حلقة على أزواج قيمة المفتاح، ومن ثم تخزينها <م> عكس في جدول تجزئة (أي المفتاح في جدول التجزئة هو في الواقع قيمة المورد والقيمة في جدول التجزئة هي مفتاح المورد). ثم ترجمات ذات القيمة> المفتاح سيكون سريع. القلق الوحيد هو كيفية التعامل مع مكررة (موارد متعددة بنفس القيمة).
وهذا ليس حقا يستحق وقتك. LINQ لم يكن لديك أي وسيلة للبحث ملف .resx بك أي أكثر كفاءة مما يمكن لكم. اعتمادا على استخدام الذاكرة وعما إذا كان التخزين المؤقت للبيانات أو لا يجعل له معنى بالنسبة لك، هل من المحتمل أن يكون أفضل حالا قراءة الملف بأكمله إلى Dictionary<TKey,TValue>
والقيام عمليات البحث الخاصة بك بهذه الطريقة.
هل يمكن، بطبيعة الحال، إنشاء كائن tuplet الخاصة بك لتخزين مفتاح / الزوج القيمة وقراءة في الملف بأكمله إلى قائمة من هذه، ثم السماح LINQ إلى كائنات لتفعل الاستعلام الخاص بك، ولكن هذا لن يكون كما أسرع وقت لDictionary
ويتطلب المزيد من النفقات العامة.