الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقالة حول ( مقارنة النصوص ) فيجوال بيسك نت

مغلق
بدأه iemad في 15 أبريل 2006 · 0 رد · 2,799 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1

بسم الله

السلام عليكم

اخوتي في الله , أنا لا املك حق الملكية لهذه المقالة ,أنا أحترم مالكها , ما أنا ألا مترجم اللغة .

وأي اخطاء في الترجمة أرجوا أن تعذروني , ومع المحافظة على الكلمات المتعارف عليها في الانجليزية .

مقدمة

Visual Studio Net يملك تشكيلة كبيرة من الأصناف (Classes) لدعم التلاعب بالسلاسل والنصوص.

الترتيب الأبجدي والاتفاقيات لمقارنة المواد يتفاوتان من ثقافة إلى أخرى لتنوع الثقافات الكتابية باللغة العربية.

اللغة العربية غنية جدا لأحتوائها عدة أشياء بالأخذ بعين الأعتبار بين المقارنة والبحث بين السلاسل والنصوص .

سوف نناقش أن شاء الله ونستعرض الى أي مدى Visual Studio.NET , .NET Framework يدعمان اللغة العربية .

المقارنة بين السلاسل والنصوص

الطريقة String.Compare , هذه الطريقة تقارن شيئان محددان من النص , سوف ترجع لنا رقم سلبي أذا كان النص الأول أقل من الثاني , وصفر أذا كان النص الأول والنص الثاني متساويين , ورقم أيجابي أذا كان النص الأول أكبر من النص الثاني .

أن الطريقة String.Compare تستخدم المعلومات في CultureInfo.CompareInfo لمقارنة النصوص .

خاصية هذا الصنف CultureInfo.CompareInfo تزود مجموعة من الطرق التي نستطيع أستعمالها لتئدية مقارنات حساسة جدا .

الكود التالي هو عبارة عن مثال يصور لنا كيف أن نصين يمكن تقييمهما بشكل مختلف بواسطة الطريقة String.Compare و الطريقة String.CompareOrdinal .

أولا الطريقة CurrentCulture سوف يتم تهيئتها الى الثقافة العربية وسوف يتم مقارنة النصين التاليين "محمد" و" مـــحـــمـــد" كلاهما يستعملان الطريقة String.Compare .

أن اللغة العربية تعتبر حروف الكاشيدا كأنها غير موجودة , ويتم نطقها أيضا كأنها غير موجودة .

على كل حال ,كلا النصين متساويين , حتى النطق باللغة العربية متساويين , سوف ترجع لنا الرقم 0 هذا لأنها أعتبرت النصين متساويين وقد تجاهلت الكاشيدا , نفهم من هذا أن الطريقة String.Compare تتجاهل تماما الكاشيدا في النصوص العربية .

ثانيا , النصين نفسهما سنقارنهما بواسطة الطريقة String.CompareOrdinal , تؤدي هذه الطريقة بحث ثنائي (Binary) ,طبعا سوف تأخد بعين الأعتبار الأختلافات .

لذا بهذه الطريقة النص "مـــحـــمـــد" ليس متساوي مع النص "محمد" , نفهم من هذا أن الطريقة String.CompareOrdinal تأخد بعين الأعتبار الأختلافات بين النصوص لذا أنتبه لهذا .

ImportsSystem.Globalization
Imports System.Threading
      .
      .
      .
        Dim Str1 As String
        Dim Str2 As String
        '  نضع CurrentCulture  الى العربية.
        Dim ArabicCult As CultureInfo() = New CultureInfo("ar")
          Str1 = "محمد"
          Str2 = "مــــحـــمـــد"
        Dim Result As Integer
          Result = String(Str1, Str2, false, ArabicCult)
        Dim ResultStr As String
          ResultStr = "The result of String.Compare "
          ResultStr += Str1 + " and " + Str2 + " is : " + CStr(Result)
          MessageBox.Show(ResultStr)
        'أستعمال المقارنة الثنائية  
          Result = String(Str1, Str2)
          ResultStr = "The result of String.CompareOrdinal "
          ResultStr += Str1 + " and " + Str2 + " is : " + CStr(Result)
          MessageBox.Show(ResultStr)

أذا نفذنا الكود السابق , سوف يرجع لنا النتائج التالية :

Message box text:

The result of String.Compare محمد and مــــحـــمـــد is : 0

Followed by, message box text:

The result of String.CompareOrdinal محمد and مــــحـــمـــد is : -19

لمزيد من المعلومات أكثر حول مقارنة النصوص , أنظر الى صنف النص (String Class) و مقارنة النصوص (Comparing Strings) في مكتبة صنف .NET Framework

المقارنة النتقدمة للنصوص

الخيارات الوصف

IgnoreNonSpace تشير بأن مقارنة النص يجب أن تهمل الألف-الهمزة في حالة العربية

IgnoreSymbols تشير بأن مقارنة النص يجب أن تهمل الرموز مثل حرف Space ورموز العملة , علامة % , الرموز الرياضية , علامة الأمبرساند , وهكذا .

بالأضافة الى أهمها علامة التشكيل , في حالة العربية .

CompareOrdinal تشير بأن مقارنة النص يجب أن تعمل مع قيم Unicode

هذا مهم جدا أذا كنت تريد أن تعطل أي بحث عن ثقافة محددة مثل تجاهل الكاشيدا

العائق الوحيد من أستعمال الطريقة (IgnoreSymbols) أنك مجبر بأن تتجاهل أو أن تهمل الرموز أذا تجاهلت علامة التشكيل .

الكود التالي مثال حول مقارنة نصين بينما نتجاهل فيها علامة التشكيل و الهمزة .

أولا , نضع ال CultureInfo الى العربية , والنصوص "أخْرَجْنَا" و "اخرجنا" قارناهما بأستعمال CompareInfo.Compare من دون أشارات أضافية .

النصين كلاهما ليسوا متساويين وسوف ترجع لنا رقم 1 . ثانيا , النصين نفسهما قارناهما بأستعمال CompareInfo.Compare , مع CompareOptions.IgnoreSymbols .

هذه الطريقة ستتجاهل وتهمل علامة التشكيل والهمزة . لذا "أخْرَجْنَا" متساوي مع النص "اخرجنا" .

Dim Str1 As String
        Dim Str2 As String
        'نسند الى CurrentCulture العربية .
        Dim ArabicCult As CultureInfo() = New CultureInfo("ar")
          Str1 = "أخْرَجْنَا"
          Str2 = "اخرجنا"
        Dim Result As Integer
        Dim ResultStr As String
          Result = ArCulture.CompareInfo.Compare(Str1, Str2)
          ResultStr = "The result of comparing text without CompareOptions "
          ResultStr += Str1 + " and " + Str2 + " is : " + CStr(Result)
          MessageBox.Show(ResultStr)
        'نستعمل المقارنة الثنائية  
          Result = ArCulture.CompareInfo.Compare(Str1, Str2,
          CompareOptions.IgnoreNonSpace Or CompareOptions.IgnoreSymbols)
          ResultStr = "The result of comparing text with CompareOptions"
          ResultStr += Str1 + " and " + Str2 + " is : " + CStr(Result)
          MessageBox.Show(ResultStr)

أيجاد النصوص

تستطيع استعمال طريقة التحميل الزائد مع الطريقة CompareInfo.IndexOf لأرجاع رقم صفر (0) مستندا على الأحرف المفهرسة أو النص البديل ضمن نص محدد .

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

أظن أنك ما زلت تستعمل الطريقة CompareOptions.IgnoreSymbols كما تم وصفها سابقا .

يصور لنا المثال التالي كيف نستخدم الطريقة CompareInfo.IndexOf(String, Char) .

نسند الى متغير ArabicCult الأتفاقية .

الطريقة التالية CompareInfo.IndexOf أستعملناها للبحث عن النص "احمد" داخل النص "أحمدْ وعُمرْ" .

 Dim Str1 As String
        Dim Str2 As String
        Dim Char As Char
        ' Set the CurrentCulture to Arabic.
        Dim ArabicCult As CultureInfo() = New CultureInfo("ar")
          Str1 = "أحمدُ و عُمر"
          Str2 = "احمد"
        Dim Result As Integer
        Dim ResultStr As String
          Result = ArCulture.CompareInfo.IndexOf(Str1, Str2,
          CompareOptions.IgnoreNonSpace Or CompareOptions.IgnoreSymbols)
          ResultStr = "The result of comparing " + Str1
          ResultStr += " with string " + Str2 + " is : " + CStr(Result)
          MessageBox.Show(ResultStr)

فرز النصوص

صنف المصفوفة تزودنا بالتحميل الزائد للمصفوفة . طريقة الفرز تلك تسمح لك بأن تفرز المصفوفات مستندا على الخاصية CultureInfo.CurrentCulture .

المثال التالي , أنشأنا مصفوفة من ثلاثة نصوص . أولا CurrentCulture أسندنا أليها الثقافة "ar-EG" والمصفوفة .

وأستدعينا طريقة الفرز , تتطلب نتيجة الفرز أن تستند على أتفاقية الفرز ل "ar-EG" الثقافة .

Dim Str1 As [String] = "عمـر"
        Dim Str2 As [String] = "عُمر"
        Dim Str3 As [String] = "عُامر"
        Dim Str4 As [String] = "أحمد"
        Dim Str5 As [String] = "احمد"
        ' Create and initialize a new Array instance to store
        Dim stringArray As Array = Array.CreateInstance(GetType([String]),5)
          stringArray.SetValue(Str1, 0)
          stringArray.SetValue(Str2, 1)
          stringArray.SetValue(Str3, 2)
          stringArray.SetValue(Str4, 3)
          stringArray.SetValue(Str5, 4)
        ' Display the values of the Array.
          PrintIndexAndValues("Before Sorting ", stringArray)
        ' Set the CurrentCulture to "ar-eg".
          Thread.CurrentThread.CurrentCulture = New CultureInfo("ar-eg")
        ' Sort the values of the Array.
          Array.Sort(stringArray)
        ' Display the values of the Array.
          PrintIndexAndValues("After Sorting ", stringArray)
        End Sub
        Public Shared Sub PrintIndexAndValues(ByVal Str As String, ByVal
          myArray As Array)
        Dim i As Integer
        Dim DispStr As String = Str
        For i = myArray.GetLowerBound(0) To myArray.GetUpperBound(0)
          DispStr += CStr(i) + " : " + myArray.GetValue(i) + " Next "
        Next i
          MessageBox.Show(DispStr)
        End Sub

أذا ما نفذت هذا الكود , سوف يظهر لنا الأخراج التالي :

Message box text:

Before Sorting 0 : عمرا Next 1 : عُمر Next 2 : عُامر Next 3 : أحمد Next 4 : احمد Next

Followed by, message box text:

After Sorting 0 : احمد Next 1 : أحمد Next 2 : عُامر Next 3 : عُمر Next 4 : عمـر Next

أرجوا أن لا تكون هنالك أخطاء , وأن وجدت أرجوا التوضيح للتعديل عليها .

تم تعديل هذه المشاركة بواسطة crazy-man في 15 أبريل 2006 في 13:39

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…