البرمجة

تحليل وتحسين برنامج تسجيل ساعات العمل.

في تطوير برنامجي لتسجيل ساعات العمل للمتطوعين، وجدت نفسي أمام تحدي استخراج التاريخ والوقت من سجل الدخول والخروج الخاص بكل متطوع. يتم تسجيل هذه البيانات في ملف نصي يحمل اسم المتطوع. الهدف هو استخدام هذه البيانات لحساب عدد ساعات العمل لكل متطوع في يوم محدد.

قمت بمحاولة استخدام الشيفرة التالية لاستخراج الوقت والتاريخ:

csharp
string datetimeStringDay1In = System.IO.File.ReadLines(@"C:/users/public/Volunteers/" + Form1.selectedUser + ".txt").Skip(23).Take(1).First(); int startPosDay1In = datetimeStringDay1In.LastIndexOf("Sign In - ") + "Sign In - ".Length + 10; int lengthDay1In = datetimeStringDay1In.IndexOf("PM") - startPosDay1In; string SignInDay1 = datetimeStringDay1In.Substring(startPosDay1In, lengthDay1In);

وأدركت أن هذا الأسلوب يتطلب وقتًا طويلاً للتنفيذ ويقوم بالتعامل مع كل سجل على حدة، مما يقيد إمكانية إضافة عدد كبير من الإدخالات. أنا ملتزم بتوفير طريقة أفضل لتحقيق هذا الهدف.

لتحسين الأداء وتبسيط العمل، يمكنك استخدام تقنيات أخرى. على سبيل المثال، يمكنك استخدام تعبيرات الاستعلام LINQ للتلاعب بالبيانات بشكل أفضل. يمكنك استخدام الكود التالي كبداية:

csharp
var lines = System.IO.File.ReadAllLines(@"C:/users/public/Volunteers/" + Form1.selectedUser + ".txt"); var signInTimes = lines.Where(line => line.Contains("Sign In")) .Select(line => DateTime.ParseExact(line.Substring(line.IndexOf('-') + 1).Trim(), "MM/dd/yy HH:mm:ss", CultureInfo.InvariantCulture)); var signOutTimes = lines.Where(line => line.Contains("Sign Out")) .Select(line => DateTime.ParseExact(line.Substring(line.IndexOf('-') + 1).Trim(), "MM/dd/yy HH:mm:ss", CultureInfo.InvariantCulture));

هذا الكود يستخدم LINQ لاستخراج توقيتات الدخول والخروج من السجل. يمكنك تطويره لحساب فارق الوقت بين كل دخول وخروج للحصول على عدد ساعات العمل لكل يوم.

أفضل الحظ في تطوير تطبيقك، وأنا هنا لأي مساعدة إضافية تحتاجها.

المزيد من المعلومات

بالطبع، يسعدني توفير مزيد من المعلومات لمساعدتك في تحسين برنامج تسجيل ساعات العمل للمتطوعين الخاص بك.

بعد استخراج توقيتات الدخول والخروج من سجل المتطوع، يمكنك استخدام الـ LINQ لحساب مدة العمل لكل يوم. على سبيل المثال، يمكنك استخدام الشيفرة التالية:

csharp
var workPeriods = signInTimes.Zip(signOutTimes, (signIn, signOut) => new { SignIn = signIn, SignOut = signOut }); foreach (var workPeriod in workPeriods) { TimeSpan workDuration = workPeriod.SignOut - workPeriod.SignIn; // يمكنك استخدام workDuration.TotalHours للحصول على عدد الساعات بشكل مباشر // يمكنك أيضًا تخزين هذه المدة في هيكل بيانات أو استخدامها حسب احتياجات تطبيقك Console.WriteLine($"Volunteer worked for {workDuration.TotalHours} hours on {workPeriod.SignIn.ToShortDateString()}"); }

تستخدم الشيفرة أعلاه LINQ لدمج قائمتي signInTimes و signOutTimes للحصول على فترات العمل، ثم تقوم بحساب مدة العمل لكل يوم باستخدام الفئة TimeSpan. يمكنك استخدام هذه المعلومات لعرض عدد ساعات العمل لكل يوم أو تخزينها في هيكل بيانات لاحقا.

علاوة على ذلك، يمكن أن يكون من المفيد إضافة تحسينات إضافية، مثل التعامل مع حالات الخطأ عند قراءة الملف أو التحقق من صحة تنسيق التاريخ والوقت.

أتمنى أن تكون هذه المعلومات مفيدة، وأن تحقق تحسينًا ملحوظًا في تصميم برنامجك. إذا كنت بحاجة إلى مساعدة إضافية أو لديك أي أسئلة إضافية، فلا تتردد في طرحها.

زر الذهاب إلى الأعلى