سؤال

ما هي أسرع طريقة لما يلي في C# 3.5:

  1. تكرار من خلال الملفات في دليل
  2. اقرأ سجلات الملف (الطول الثابت 247 حرفًا)
  3. قم بتحويل سلسلة الطول الثابت لكل سجل إلى بنية أو فئة.

شكرًا

هل كانت مفيدة؟

المحلول

سيكون هذا سريعًا نسبيًا للكتابة:

var myStructs = 
from file in Directory.GetFiles(".", "*.*", SearchOption.TopDirectoryOnly)
select ConvertFileToStructs(File.ReadAllText(file));

إذا كانت هذه هي أسرع طريقة ممكنة ، فالأداء؟ ربما لا ، لكنها لن تحدث فرقًا كبيرًا. ما سيؤثر على الأداء هو تنفيذ التخلص من دالة ConvertFileToStructs (). ولكن للإجابة على هذا ، نحتاج إلى معرفة التنسيق المحدد لملفاتك.


فقط اقرأ تعليقاتك. أود أن أقترح التحليل التالي:

List<MyStruct> ConvertFileToStructs(string content, int[] mapping)
{
    var records = new List<MyStruct>();
    int length = content.Length();
    for(int i = 0; i < length; i += 247)
         records.Add(ConvertRecordToStruct(content.Substring(i,247), mapping));
    return records;
}

MyStruct ConvertRecordToStruct(string record, int[] mapping)
{
    MyStruct s;
    s.Field1 =  record.Substring(mapping[0], mapping[1]);
    //set other fields
    return s;
}

من المحتمل أن يتم تحسين هذا الرمز للأداء ، لكنني لا أعتقد أنه سيغير الأمور بشكل كبير ، خاصةً لأن I/O إلى القرص متورط و Srackring () سريع جدًا (انظر http://dotnetperls.com/substring). بالطبع سيكون عليك اختبار هذا على جهازك.

نصائح أخرى

فئة مخصصة للتعامل مع الملفات

   class customFile
        {
            string fileText;
            public string FileText
            {
                get { return fileText; }
                set { fileText = value; }
            }
        }

اقرأ كل النص

        string[] filePaths = Directory.GetFiles(dirPath);
        List<customFile> customFiles = new List<customFile>();
        foreach (string file in filePaths)
        {
            customFiles.Add(new customFile { FileText = File.ReadAllText(file) });
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top