البرمجة

تحسين مقارنة الهاش مجموعات في C#

عند التعامل مع تطبيقات البرمجة وتحديدًا استخدام مجموعات البيانات مثل HashSet في لغة البرمجة C#، قد تحتاج في بعض الأحيان إلى تعديل طريقة مقارنة الكائنات لتحقيق النتائج المرجوة. في السياق الحالي، ترغب في استخدام مجموعة الهاش (HashSet) لكائنات من النوع ConnSrv. ومن أجل ذلك، يجب أن تحدد كيفية مقارنة الكائنات من هذا النوع لتحديد المساواة.

بالنظر إلى الشيفرة التي قدمتها، يمكنك رؤية أن الكلاس ConnSrv يحتوي على خصائص تسمى Service و ConnectsToService. من المفهوم أن لكائني ConnSrv يتم اعتبارهما متساويان إذا كانت قيم هذين الخصائص متساوية. لتحقيق هذا المطلب، يمكنك القيام بتعديلات على الطرق Equals و GetHashCode.

في السياق الحالي، من الأنسب استخدام تجاويف الـ Equals و GetHashCode للكلاس ConnSrv. يجب عليك تعديل هذه الطرق لتنفيذ المقارنة بناءً على القيمة الخاصة بـ Service و ConnectsToService.

سنبدأ بتعديل الـ Equals:

csharp
public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) { return false; } ConnSrv other = (ConnSrv)obj; return (Service == other.Service && ConnectsToService == other.ConnectsToService); }

ثم، يجب تعديل الطريقة GetHashCode لتكون متسقة مع تعديلات الـ Equals:

csharp
public override int GetHashCode() { unchecked // overflow is fine, just wrap { int hash = 17; hash = hash * 23 + Service.GetHashCode(); hash = hash * 23 + ConnectsToService.GetHashCode(); return hash; } }

بعد تنفيذ هذه التغييرات، ستكون قادرًا على استخدام العمليات التي ذكرتها مثل Contains و Except و ExceptWith و UnionWith بشكل صحيح مع مجموعات ConnSrv. ستقوم هذه العمليات بمقارنة الكائنات استنادًا إلى قيم خصائصها Service و ConnectsToService.

لذا، باستخدام الشيفرة التي قمت بتعديلها، يمكنك تحقيق النتائج التي توقعتها:

csharp
var testHS1 = new HashSet(); testHS1.Add(test1); testHS1.Contains(test2); // سيعيد النتيجة صحيح var testHS2 = new HashSet(); testHS2.Add(test1); testHS2.Add(test2); testHS2.Add(test3); testHS2.ExceptWith(testHS1); // سيحتوي الناتج على test3 فقط

بهذا، يمكنك الآن القيام بالعمليات المطلوبة بنجاح باستخدام مجموعات ConnSrv بشكل صحيح.

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

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

أولاً، يُفضل دائمًا استخدام التحويل الآمن والتأكد من أن الكائن الذي يتم تمريره إلى Equals فعليًا من نفس النوع. هذا يمنع الأخطاء التشغيلية التي قد تحدث نتيجة لتحويل غير صحيح.

ثانيًا، تجنب استخدام الخصائص القابلة للتغيير في Equals و GetHashCode. إذا كنت تقوم بتعديل الخصائص Service و ConnectsToService بعد إنشاء الكائن، فقد تتغير قيمة الهاش كود وبالتالي قد لا تتمكن من العثور على الكائن في المجموعات بشكل صحيح.

ثالثًا، تأكد من تنفيذ الاعتمادية الثنائية. هذا يعني أنه إذا كان كائن A مساوٍ لكائن B، فإن كائن B يجب أيضًا أن يكون مساوٍ لكائن A. هذا يساعد في ضمان أن العمليات مثل Except و ExceptWith تعمل بشكل صحيح في كل الحالات.

بناءً على هذه النقاط، يمكنك تحسين الكود ليبدو مثل هذا:

csharp
public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) { return false; } ConnSrv other = (ConnSrv)obj; return (Service == other.Service && ConnectsToService == other.ConnectsToService); } public override int GetHashCode() { unchecked // overflow is fine, just wrap { int hash = 17; hash = hash * 23 + Service.GetHashCode(); hash = hash * 23 + ConnectsToService.GetHashCode(); return hash; } }

باستخدام هذا التحسين، يمكنك الآن الاعتماد على نتائج العمليات التي تستخدم مجموعات ConnSrv بشكل أكثر موثوقية وصحة.

في النهاية، تعديل Equals و GetHashCode هو خطوة مهمة لتحقيق الوظائف المطلوبة من الهاش مجموعات في تطبيقك. باستخدام الطريقة الصحيحة لمقارنة الكائنات وتوليد مفاتيح الهاش، يمكنك الاعتماد على النتائج التي تتوقعها في تطبيقك بدون مشاكل.

مقالات ذات صلة

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر