سؤال

وأنا أحاول لبناء وسيلة للحصول على المفتاح للحصول على قطعة معينة من النص في ملف .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 ويتطلب المزيد من النفقات العامة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top