4. کلاسهای پرکاربرد .NET
در اینجا چند کلاس از پلتفرم .NET را معرفی میکنیم که حتی برای یک مبتدی نیز جالب هستند. ابتدا نشان میدهیم چگونه از صدها کلاس موجود مطلع شوید.
4.1. درخواست کمک با SDK.NET
4.1.1. wincv
اگر فقط SDK را نصب کرده و نه Visual Studio.NET را، میتوانید از برنامه wincv.exe که معمولاً در ساختار پوشه SDK، برای مثال C:\Program Files\Microsoft Visual Studio قرار دارد، استفاده کنید.NET 2003\SDK\v1.1. وقتی این ابزار را اجرا میکنید، رابط کاربری زیر ظاهر میشود:
![]() |
نام کلاس مورد نظر را در (۱) وارد کنید. این کار فهرستی از تمهای ممکن را در (۲) نمایش میدهد. تم مناسب را انتخاب کنید و نتیجه در (۳) ظاهر میشود – در این مورد، کلاس HashTable. این روش زمانی مناسب است که نام کلاسی را که به دنبال آن هستید بدانید. اگر میخواهید فهرست گزینههای ارائهشده توسط . را کاوش کنید.NET، میتوانید از فایل HTML StartHere.htm، که مستقیماً در پوشه نصب SSK.Net، برای مثال C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.

لینک .NET Framework SDK Documentation همان لینکی است که باید دنبال کنید تا نمایی کلی از کلاسهای .NET به دست آورید:

از آنجا، پیوند [Bibliothèque de classes] را دنبال کنید. این شامل فهرستی از تمام کلاسهای موجود در .NET است:

برای مثال، بیایید لینک System.Collections را دنبال کنیم. این فضای نام شامل کلاسهای مختلفی است که مجموعهها را پیادهسازی میکنند، از جمله کلاس HashTable:

بیایید لینک HashTable را در زیر دنبال کنیم:

به صفحه زیر هدایت میشویم:

به موقعیت نشانگر دست در زیر توجه کنید. این نشانگر به لینکی اشاره میکند که به شما امکان میدهد زبان مورد نظر، در این مورد ویژوال بیسیک، را مشخص کنید.
در اینجا پروتوتایپ کلاس و همچنین مثالهایی از نحوه استفاده از آن را خواهید یافت. بیایید لینک [Hashtable, membres] را در زیر دنبال کنیم:

این توضیح کامل کلاس را ارائه میدهد:

این بهترین راه برای کاوش SDK و کلاسهای آن است. ابزار WinCV زمانی به کار میآید که شما قبلاً کمی درباره کلاس میدانید اما برخی از اعضای آن را فراموش کردهاید. سپس WinCV به شما امکان میدهد تا به سرعت کلاس و اعضای آن را پیدا کنید.
4.2. درخواست کمک برای کلاسها با استفاده از VS.NET
در اینجا چند نکته برای یافتن راهنما در مورد Visual Studio.NET آورده شده است
4.2.1. گزینهٔ کمک
گزینه [?] را از منو انتخاب کنید.

پنجره زیر ظاهر میشود:

از فهرست کشویی میتوانید یک فیلتر راهنما را انتخاب کنید. در اینجا، فیلتر [Visual Basic] را انتخاب میکنیم.

دو موضوع کمکی مفید هستند:
- راهنمای زبان VB.NET خود (دستور زبان)
- راهنما در مورد عناصر classes.NET که میتوان از آنها با زبان VB.NET استفاده کرد
راهنمای زبان VB.NET را میتوان از طریق [Visual Studio.NET/Visual Basic et Visual C#/Reference/Visual Basic] دسترسی داشت:

این صفحهٔ راهنمای زیر را نمایش میدهد:

از آنجا، بخشهای فرعی مختلف راهنماییهایی در مورد موضوعات گوناگون مرتبط با VB.NET ارائه میدهند. لطفاً توجه ویژهای به آموزشهای VB.NET داشته باشید:

برای دسترسی به کلاسهای مختلف در پلتفرم .NET، بخش راهنمای [Visual Studio.NET/.NET Framework] را انتخاب کنید.

بخش [Référence/Bibliothèque de classes] از اهمیت ویژهای برخوردار است:

فرض کنید ما به کلاس [ArrayList] علاقهمند هستیم. این کلاس در فضای نام [System.Collections] قرار دارد. آگاهی از این موضوع مهم است؛ در غیر این صورت، بهتر است از روش جستجوی توصیفشده در زیر استفاده کنید. راهنمای زیر نمایش داده میشود:

پیوند [ArrayList, classe] نمایی کلی از کلاس را ارائه میدهد:

این نوع صفحه برای همه کلاسها وجود دارد. این صفحه خلاصهای از کلاس را همراه با مثالها ارائه میدهد. برای توضیحات اعضای کلاس، به لینک [ArrayList, membres] مراجعه کنید:

4.2.2. راهنما/فهرست

گزینه [Aide/index] به شما امکان میدهد تا به جستجوی راهنماییهای دقیقتر نسبت به گزینه قبلی بپردازید. کافی است کلمه کلیدی مورد نظر خود را تایپ کنید:

مزیت این روش نسبت به روش قبلی در این است که نیازی نیست بدانید اطلاعاتی که به دنبال آن هستید در کجای سیستم راهنما قرار دارد. این روش احتمالاً روش ترجیحی برای انجام یک جستجوی هدفمند است، در حالی که روش دیگر برای کاوش در تمام امکانات سیستم راهنما مناسبتر است.
4.3. کلاس String
کلاس String دارای خواص و متدهای متعددی است. در اینجا به چند مورد از آنها اشاره میشود:
تعداد کاراکترها در رشته | |
ویژگی فهرستشده پیشفرض. [String].Chars(i) کاراکتر i-ام در رشته است | |
اگر رشته با مقدار پایان یابد، مقدار true را برمیگرداند | |
در صورتی که رشته با 'value' شروع شود، مقدار true را برمیگرداند | |
در صورتی که رشته با مقدار برابر باشد، مقدار true را برمیگرداند | |
اولین رخداد رشته 'value' را در داخل رشته بازمیگرداند – جستجو از موقعیت کاراکتری 0 آغاز میشود | |
موقعیت اول در رشتهٔ 'value' را بازمیگرداند – جستجو از کاراکتر شماره startIndex شروع میشود | |
متد کلاس – رشتهای را که از الحاق مقادیر در آرایه `value` با استفاده از `separator` حاصل شده، برمیگرداند. | |
یک رشته را بازمیگرداند که کپیای از رشتهٔ فعلی است، که در آن کاراکتر oldChar با کاراکتر newChar جایگزین شده است | |
این رشته بهعنوان دنبالهای از فیلدها در نظر گرفته میشود که با کاراکترهای آرایه `separator` از هم جدا شدهاند. نتیجه، آرایهای از این فیلدها است. | |
یک زیر رشتهی رشتهی فعلی که از موقعیت startIndex شروع شده و شامل length کاراکتر است | |
رشتهٔ جاری را به حروف کوچک تبدیل میکند | |
متن فعلی را به حروف بزرگ تبدیل میکند | |
فاصلههای خالی ابتدایی و انتهایی را از رشتهٔ جاری حذف میکند |
یک رشته C را میتوان بهعنوان یک آرایه از کاراکترها در نظر گرفت. بنابراین
- C.Chars(i) کاراکتر i-ام در C است
- C.Length تعداد کاراکترهای C است
مثال زیر را در نظر بگیرید:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Module test
Sub Main()
Dim uneChaine As String = "l'oiseau vole au-dessus des nuages"
affiche("uneChaine=" + uneChaine)
affiche("uneChaine.Length=" & uneChaine.Length)
affiche("chaine[10]=" + uneChaine.Chars(10))
affiche("uneChaine.IndexOf(""vole"")=" & uneChaine.IndexOf("vole"))
affiche("uneChaine.IndexOf(""x"")=" & uneChaine.IndexOf("x"))
affiche("uneChaine.LastIndexOf('a')=" & uneChaine.LastIndexOf("a"c))
affiche("uneChaine.LastIndexOf('x')=" & uneChaine.LastIndexOf("x"c))
affiche("uneChaine.Substring(4,7)=" + uneChaine.Substring(4, 7))
affiche("uneChaine.ToUpper()=" + uneChaine.ToUpper())
affiche("uneChaine.ToLower()=" + uneChaine.ToLower())
affiche("uneChaine.Replace('a','A')=" + uneChaine.Replace("a"c, "A"c))
Dim champs As String() = uneChaine.Split(Nothing)
Dim i As Integer
For i = 0 To champs.Length - 1
affiche("champs[" & i & "]=[" & champs(i) & "]")
Next i
affiche("Join("":"",champs)=" + System.String.Join(":", champs))
affiche("("" abc "").Trim()=[" + " abc ".Trim() + "]")
End Sub
' نمایش میدهد
Sub affiche(ByVal msg As [String])
' پیام را نمایش میدهد
Console.Out.WriteLine(msg)
End Sub
End Module
اجرا نتایج زیر را تولید میکند:
dos>vbc string1.vb
dos>string1
uneChaine=l'oiseau vole au-dessus des nuages
uneChaine.Length=34
chaine[10]=o
uneChaine.IndexOf("vole")=9
uneChaine.IndexOf("x")=-1
uneChaine.LastIndexOf('a')=30
uneChaine.LastIndexOf('x')=-1
uneChaine.Substring(4,7)=seau vo
uneChaine.ToUpper()=L'OISEAU VOLE AU-DESSUS DES NUAGES
uneChaine.ToLower()=l'oiseau vole au-dessus des nuages
uneChaine.Replace('a','A')=l'oiseAu vole Au-dessus des nuAges
champs[0]=[l'oiseau]
champs[1]=[vole]
champs[2]=[au-dessus]
champs[3]=[des]
champs[4]=[nuages]
Join(":",champs)=l'oiseau:vole:au-dessus:des:nuages
(" abc ").Trim()=[abc]
بیایید مثال دیگری را در نظر بگیریم:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Module string2
Sub Main()
' خطی که باید تحلیل شود
Dim ligne As String = "un:deux::trois:"
'جداکنندههای فیلد
Dim séparateurs() As Char = {":"c}
' تقسیم
Dim champs As String() = ligne.Split(séparateurs)
Dim i As Integer
For i = 0 To champs.Length - 1
Console.Out.WriteLine(("Champs[" & i & "]=" & champs(i)))
Next i
' پیوند
Console.Out.WriteLine(("join=[" + System.String.Join(":", champs) + "]"))
End Sub
End Module
و نتایج اجرا:
متد Split کلاس String برای تقسیم فیلدهای یک رشتهٔ کاراکتری به یک آرایه استفاده میشود. تعریف متد مورد استفاده در اینجا به شرح زیر است:
یک آرایه از کاراکترها. این کاراکترها نمایانگر کاراکترهای مورد استفاده برای جدا کردن فیلدها در رشته هستند. بنابراین، اگر رشته [champ1, champ2, champ3] باشد، میتوان از `separator=new char() {","c}` استفاده کرد. اگر جداکننده یک دنباله از فاصلهها باشد، از separator=nothing استفاده میشود. | |
یک آرایه از رشتهها که هر عنصر آن یک فیلد در رشته است. |
متد **Join** یک متد استاتیک از کلاس String است:
آرایهای از رشتهها | |
یک رشته برای استفاده به عنوان جداکننده فیلد | |
یک رشته که با الحاق عناصر آرایه value، که توسط رشته separator از هم جدا شدهاند، تشکیل شده است. |
4.4. کلاس Array
کلاس Array یک آرایه را پیادهسازی میکند. در مثال ما، از ویژگیها و متدهای زیر استفاده خواهیم کرد:
خصلت – تعداد عناصر آرایه | |
متد کلاس – موقعیت value را در آرایه مرتبشده array بازمیگرداند – از موقعیت index و با length عنصر جستجو میکند | |
متد کلاس – عناصر را از sourceArray تا destinationArray کپی میکند – destinationArray در این فرآیند ایجاد میشود | |
متد کلاس – آرایه array را مرتب میکند – این باید شامل یک نوع داده با تابع مرتبسازی پیشفرض باشد (رشتهها، اعداد). |
برنامه زیر کاربرد کلاس Array را نشان میدهد:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Module test
Sub Main()
'خواندن عناصر آرایه واردشده از طریق صفحهکلید
Dim terminé As [Boolean] = False
Dim i As Integer = 0
Dim éléments1 As Double() = Nothing
Dim éléments2 As Double() = Nothing
Dim élément As Double = 0
Dim réponse As String = Nothing
Dim erreur As [Boolean] = False
While Not terminé
' سوال
Console.Out.Write(("Elément (réel) " & i & " du tableau (rien pour terminer) : "))
' خواندن پاسخ
réponse = Console.ReadLine().Trim()
'پایان ورودی اگر رشته خالی باشد
If réponse.Equals("") Then
Exit While
End If
' بررسی ورودی
Try
élément = [Double].Parse(réponse)
erreur = False
Catch
Console.Error.WriteLine("Saisie incorrecte, recommencez")
erreur = True
End Try
' اگر خطایی وجود نداشته باشد
If Not erreur Then
' آرایهٔ جدید برای نگهداری عنصر جدید
éléments2 = New Double(i) {}
' کپی آرایه قدیمی در آرایه جدید
If i <> 0 Then
Array.Copy(éléments1, éléments2, i)
End If
' آرایهٔ جدید به آرایهٔ قدیمی تبدیل میشود
éléments1 = éléments2
' آرایه جدید دیگر مورد نیاز نیست
éléments2 = Nothing
' افزودن عنصر جدید
éléments1(i) = élément
'یک عنصر دیگر در آرایه
i += 1
End If
End While
'نمایش آرایهٔ مرتبنشده
System.Console.Out.WriteLine("Tableau non trié")
For i = 0 To éléments1.Length - 1
Console.Out.WriteLine(("éléments[" & i & "]=" & éléments1(i)))
Next i
'مرتبسازی جدول
System.Array.Sort(éléments1)
'نمایش جدول مرتبشده
System.Console.Out.WriteLine("Tableau trié")
For i = 0 To éléments1.Length - 1
Console.Out.WriteLine(("éléments[" & i & "]=" & éléments1(i)))
Next i
'جستجو
While Not terminé
' سؤال
Console.Out.Write("Elément cherché (rien pour arrêter) : ")
' خواندن و بررسی پاسخ
réponse = Console.ReadLine().Trim()
' تمام شد؟
If réponse.Equals("") Then
Exit While
End If
'بررسی
Try
élément = [Double].Parse(réponse)
erreur = False
Catch
Console.Error.WriteLine("Saisie incorrecte, recommencez")
erreur = True
End Try
' اگر خطایی وجود نداشته باشد
If Not erreur Then
' جستجوی عنصر در آرایه مرتبشده
i = System.Array.BinarySearch(éléments1, 0, éléments1.Length, élément)
' نمایش پاسخ
If i >= 0 Then
Console.Out.WriteLine(("Trouvé en position " & i))
Else
Console.Out.WriteLine("Pas dans le tableau")
End If
End If
End While
End Sub
End Module
خروجی صفحه به شرح زیر است:
Elément (réel) 0 du tableau (rien pour terminer) : 10,4
Elément (réel) 1 du tableau (rien pour terminer) : 5,2
Elément (réel) 2 du tableau (rien pour terminer) : 8,7
Elément (réel) 3 du tableau (rien pour terminer) : 3,6
Elément (réel) 4 du tableau (rien pour terminer) :
Tableau non trié
éléments[0]=10,4
éléments[1]=5,2
éléments[2]=8,7
éléments[3]=3,6
Tableau trié
éléments[0]=3,6
éléments[1]=5,2
éléments[2]=8,7
éléments[3]=10,4
Elément cherché (rien pour arrêter) : 8,7
Trouvé en position 2
Elément cherché (rien pour arrêter) : 11
Pas dans le tableau
Elément cherché (rien pour arrêter) : a
Saisie incorrecte, recommencez
Elément cherché (rien pour arrêter) :
بخش اول برنامه یک آرایه از دادههای عددی واردشده از طریق صفحهکلید ایجاد میکند. اندازهٔ این آرایه را نمیتوان از پیش تعیین کرد، زیرا تعداد عناصری که کاربر وارد خواهد کرد نامشخص است. بنابراین ما با دو آرایه کار میکنیم: éléments1 و éléments2.
' آرایهٔ جدید برای نگهداری عنصر جدید
éléments2 = New Double(i) {}
' کپی آرایه قدیمی در آرایه جدید
If i <> 0 Then
Array.Copy(éléments1, éléments2, i)
End If
' آرایهٔ جدید به آرایهٔ قدیمی تبدیل میشود
éléments1 = éléments2
' دیگر به جدول جدید نیازی نیست
éléments2 = Nothing
' افزودن عنصر جدید
éléments1(i) = élément
'یک عنصر دیگر در جدول
i += 1
آرایه éléments1 حاوی مقادیر وارد شده در حال حاضر است. هنگامی که کاربر مقدار جدیدی اضافه میکند، یک آرایه éléments2 با یک عنصر بیشتر از éléments1 ایجاد میشود، محتویات éléments1 به éléments2 (Array.Copy) کپی میشود، ما éléments1 را به éléments2 «اشاره» میدهیم، و در نهایت عنصر جدید را به éléments1 اضافه میکنیم. این یک فرآیند پیچیده است که در صورت استفاده از یک آرایه با اندازه متغیر (ArrayList) به جای یک آرایه با اندازه ثابت (Array)، میتوان آن را سادهتر کرد.
این آرایه با استفاده از روش Array.Sort مرتب میشود. این روش را میتوان با پارامترهای مختلف که قواعد مرتبسازی را مشخص میکنند، فراخوانی کرد. بدون پارامتر، مرتبسازی بهصورت صعودی پیشفرض انجام میشود. در نهایت، روش Array.BinarySearch به شما امکان میدهد در یک آرایه مرتبشده به دنبال یک عنصر بگردید.
4.5. کلاس ArrayList
کلاس ArrayList امکان پیادهسازی آرایههایی با اندازه متغیر را در حین اجرای برنامه فراهم میکند، که این امر با کلاس قبلی Array امکانپذیر نبود. در اینجا برخی از ویژگیها و متدهای رایج آورده شده است:
یک لیست خالی ایجاد میکند | |
تعداد آیتمهای مجموعه | |
اضافه کردن شیء مقدار به انتهای مجموعه | |
فهرست را پاک میکند | |
شاخص شیء «value» در لیست، یا -1 اگر وجود نداشته باشد | |
همانند بالا، اما جستجو از عنصر شماره startIndex | |
همانند مورد بالا، اما شاخص آخرین رخداد 'value' در لیست را برمیگرداند | |
همانند مورد بالا، اما جستجو از عنصر شماره startIndex انجام میشود | |
شیء 'obj' را در صورت وجود در لیست حذف میکند | |
عنصر با شاخص را از لیست حذف میکند | |
موقعیت شیء «value» را در لیست برمیگرداند، یا در صورت عدم وجود -1 را برمیگرداند. لیست باید مرتب باشد. | |
فهرست را مرتب میکند. فهرست باید شامل اشیایی با ترتیب از پیش تعریفشده (رشتهها، اعداد) باشد. | |
فهرست را بر اساس ترتیب تعیینشده توسط تابع مقایسه مرتب میکند |
بیایید مثال را با استفاده از اشیاء از نوع Array مجدداً بررسی کنیم و آن را با استفاده از اشیاء از نوع ArrayList پردازش کنیم:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Module test
Sub Main()
' خواندن عناصر آرایه وارد شده از طریق صفحهکلید
Dim terminé As [Boolean] = False
Dim i As Integer = 0
Dim éléments As New ArrayList
Dim élément As Double = 0
Dim réponse As String = Nothing
Dim erreur As [Boolean] = False
While Not terminé
' سؤال
Console.Out.Write(("Elément (réel) " & i & " du tableau (rien pour terminer) : "))
' خواندن پاسخ
réponse = Console.ReadLine().Trim()
'پایان ورودی اگر رشته خالی باشد
If réponse.Equals("") Then
Exit While
End If
' بررسی ورودی
Try
élément = Double.Parse(réponse)
erreur = False
Catch
Console.Error.WriteLine("Saisie incorrecte, recommencez")
erreur = True
End Try
' اگر خطایی وجود نداشته باشد
If Not erreur Then
' افزودن یک عنصر دیگر به آرایه
éléments.Add(élément)
End If
End While
' نمایش آرایه مرتبنشده
System.Console.Out.WriteLine("Tableau non trié")
For i = 0 To éléments.Count - 1
Console.Out.WriteLine(("éléments[" & i & "]=" & éléments(i).ToString))
Next i ' tri du tableau
éléments.Sort()
' نمایش آرایه مرتبشده
System.Console.Out.WriteLine("Tableau trié")
For i = 0 To éléments.Count - 1
Console.Out.WriteLine(("éléments[" & i & "]=" & éléments(i).ToString))
Next i
'جستجو
While Not terminé
' سوال
Console.Out.Write("Elément cherché (rien pour arrêter) : ")
' خواندن و بررسی پاسخ
réponse = Console.ReadLine().Trim()
' تمام شد؟
If réponse.Equals("") Then
Exit While
End If
'بررسی
Try
élément = [Double].Parse(réponse)
erreur = False
Catch
Console.Error.WriteLine("Saisie incorrecte, recommencez")
erreur = True
End Try
' اگر خطا وجود نداشته باشد
If Not erreur Then
' جستجوی عنصر در آرایه مرتبشده
i = éléments.BinarySearch(élément)
' نمایش پاسخ
If i >= 0 Then
Console.Out.WriteLine(("Trouvé en position " & i))
Else
Console.Out.WriteLine("Pas dans le tableau")
End If
End If
End While
End Sub
End Module
نتایج اجرا به شرح زیر است:
Elément (réel) 0 du tableau (rien pour terminer) : 10,4
Elément (réel) 0 du tableau (rien pour terminer) : 5,2
Elément (réel) 0 du tableau (rien pour terminer) : a
Saisie incorrecte, recommencez
Elément (réel) 0 du tableau (rien pour terminer) : 3,7
Elément (réel) 0 du tableau (rien pour terminer) : 15
Elément (réel) 0 du tableau (rien pour terminer) :
Tableau non trié
éléments[0]=10,4
éléments[1]=5,2
éléments[2]=3,7
éléments[3]=15
Tableau trié
éléments[0]=3,7
éléments[1]=5,2
éléments[2]=10,4
éléments[3]=15
Elément cherché (rien pour arrêter) : a
Saisie incorrecte, recommencez
Elément cherché (rien pour arrêter) : 15
Trouvé en position 3
Elément cherché (rien pour arrêter) : 1
Pas dans le tableau
Elément cherché (rien pour arrêter) :
4.6. کلاس Hashtable
کلاس Hashtable برای پیادهسازی یک دیکشنری استفاده میشود. یک دیکشنری را میتوان به صورت یک آرایه دو ستونی در نظر گرفت:
![]() |
کلیدها منحصربهفرد هستند، c.a.d، به این معنی که هیچ دو کلیدی نمیتوانند یکسان باشند. روشها و ویژگیهای اصلی کلاس Hashtable به شرح زیر است:
ایجاد یک دیکشنری خالی | |
یک ورودی (کلید، مقدار) به دیکشنری اضافه میکند، که در آن کلید و مقدار ارجاع به شی هستند. | |
ورودی key=key را از دیکشنری حذف میکند | |
واژهنامه را پاک میکند | |
اگر کلید 'key' در دیکشنری وجود داشته باشد، مقدار true را برمیگرداند. | |
اگر مقدار 'value' در دیکشنری موجود باشد، مقدار true را برمیگرداند. | |
ویژگی: تعداد عناصر در دیکشنری (کلید، مقدار) | |
ویژگی: مجموعه کلیدهای دیکشنری | |
خواصیت: مجموعه مقادیر دیکشنری | |
ویژگی شاخصدار: به شما امکان میدهد مقدار مرتبط با یک کلید را بازیابی یا تنظیم کنید |
برنامهٔ نمونهٔ زیر را در نظر بگیرید:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Module test
Sub Main()
Dim liste() As [String] = {"jean:20", "paul:18", "mélanie:10", "violette:15"}
Dim i As Integer
Dim champs As [String]() = Nothing
Dim séparateurs() As Char = {":"c}
' پر کردن دیکشنری
Dim dico As New Hashtable
For i = 0 To liste.Length - 1
champs = liste(i).Split(séparateurs)
dico.Add(champs(0), champs(1))
Next i
' تعداد عناصر در دیکشنری
Console.Out.WriteLine(("Le dictionnaire a " & dico.Count & " éléments"))
' فهرست کلیدها
Console.Out.WriteLine("[Liste des clés]")
Dim clés As IEnumerator = dico.Keys.GetEnumerator()
While clés.MoveNext()
Console.Out.WriteLine(clés.Current)
End While
' فهرست مقادیر
Console.Out.WriteLine("[Liste des valeurs]")
Dim valeurs As IEnumerator = dico.Values.GetEnumerator()
While valeurs.MoveNext()
Console.Out.WriteLine(valeurs.Current)
End While
' فهرست کلیدها و مقادیر
Console.Out.WriteLine("[Liste des clés & valeurs]")
clés.Reset()
While clés.MoveNext()
Console.Out.WriteLine(("clé=" & clés.Current.ToString & " valeur=" & dico(clés.Current).ToString))
End While
'کلید «paul» حذف شده است
Console.Out.WriteLine("[Suppression d'une clé]")
dico.Remove("paul")
' فهرست کلیدها و مقادیر
Console.Out.WriteLine("[Liste des clés & valeurs]")
clés = dico.Keys.GetEnumerator()
While clés.MoveNext()
Console.Out.WriteLine(("clé=" & clés.Current.ToString & " valeur=" & dico(clés.Current).ToString))
End While
' جستجو در فرهنگ لغت
Dim nomCherché As [String] = Nothing
Console.Out.Write("Nom recherché (rien pour arrêter) : ")
nomCherché = Console.ReadLine().Trim()
Dim value As [Object] = Nothing
While Not nomCherché.Equals("")
If dico.ContainsKey(nomCherché) Then
value = dico(nomCherché)
Console.Out.WriteLine((nomCherché + "," + CType(value, [String])))
Else
Console.Out.WriteLine(("Nom " + nomCherché + " inconnu"))
End If
' جستجوی بعدی
Console.Out.Write("Nom recherché (rien pour arrêter) : ")
nomCherché = Console.ReadLine().Trim()
End While
End Sub
End Module
نتایج اجرا به شرح زیر است:
Le dictionnaire a 4 éléments
[Liste des clés]
mélanie
paul
violette
jean
[Liste des valeurs]
10
18
15
20
[Liste des clés & valeurs]
clé=mélanie valeur=10
clé=paul valeur=18
clé=violette valeur=15
clé=jean valeur=20
[Suppression d'une clé]
[Liste des clés & valeurs]
clé=mélanie valeur=10
clé=violette valeur=15
clé=jean valeur=20
Nom recherché (rien pour arrêter) : paul
Nom paul inconnu
Nom recherché (rien pour arrêter) : mélanie
mélanie,10
Nom recherché (rien pour arrêter) :
این برنامه همچنین از یک شی IEnumerator برای تکرار در مجموعه کلیدها و مقادیر در فرهنگ لغت ICollection استفاده میکند (به خواص Keys و Values در بالا مراجعه کنید). یک مجموعه (collection) مجموعهای از اشیاء است که میتوان بر روی آنها حلقهای اجرا کرد. رابط ICollection به صورت زیر تعریف شده است:

ویژگی Count به ما امکان میدهد تعداد عناصر مجموعه را تعیین کنیم. رابط ICollection از رابط IEnumerable ارث میبرد:

این رابط تنها یک متد دارد، GetEnumerator، که به ما امکان میدهد یک شی از نوع IEnumerator را به دست آوریم:

متد GetEnumerator() یک مجموعه ICollection به ما امکان میدهد تا با استفاده از روشهای زیر در مجموعه تکرار کنیم:
به عنصر بعدی در مجموعه منتقل میشود. اگر این عنصر وجود داشته باشد مقدار true و در غیر این صورت مقدار false را برمیگرداند. اولین MoveNext به اولین عنصر منتقل میشود. عنصر «جاری» مجموعه سپس در خصوصیت Current ایتراتور در دسترس است. | |
ویژگی: عنصر جاری مجموعه | |
نشانگر را در ابتدای مجموعه، c.a.d، قبل از اولین عنصر قرار میدهد. |
بنابراین ساختار برای تکرار بر روی عناصر یک مجموعه (ICollection) در C به شرح زیر است:
' تعریف مجموعه
dim C as ICollection C=...
' دریافت یک ایتراتور برای این مجموعه
dim itérateur as IEnumerator=C.GetEnumerator();
' با استفاده از این ایتراتور، مجموعه را بهصورت متوالی طی کنید
while(itérateur.MoveNext())
' ما یک عنصر جاری داریم
' پردازش QZXW2HTMLCaXTDqXJhdGV1ci.CdXJyZW50ZQX
end while
4.7. کلاس StreamReader
کلاس StreamReader به شما امکان میدهد محتوای یک فایل را بخوانید. در اینجا برخی از ویژگیها و متدهای آن آمده است:
یک استریم از مسیر فایل باز میکند. اگر فایل وجود نداشته باشد، یک استثنا پرتاب میشود | |
جریان را میبندد | |
یک خط را از جریان بازخوانی میکند | |
بقیهٔ جریان را از موقعیت فعلی میخواند |
در اینجا یک مثال آورده شده است:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Imports System.IO
Module test
Sub Main()
Dim ligne As String = Nothing
Dim fluxInfos As StreamReader = Nothing
' خواندن محتویات فایل
Try
fluxInfos = New StreamReader("infos.txt")
ligne = fluxInfos.ReadLine()
While Not (ligne Is Nothing)
System.Console.Out.WriteLine(ligne)
ligne = fluxInfos.ReadLine()
End While
Catch e As Exception
System.Console.Error.WriteLine("L'erreur suivante s'est produite : " & e.ToString)
Finally
Try
fluxInfos.Close()
Catch
End Try
End Try
End Sub
End Module
و نتایج اجرای آن:
dos>more infos.txt
12620:0:0
13190:0,05:631
15640:0,1:1290,5
24740:0,15:2072,5
31810:0,2:3309,5
39970:0,25:4900
48360:0,3:6898,5
55790:0,35:9316,5
92970:0,4:12106
127860:0,45:16754,5
151250:0,5:23147,5
172040:0,55:30710
195000:0,6:39312
0:0,65:49062
dos>file1
12620:0:0
13190:0,05:631
15640:0,1:1290,5
24740:0,15:2072,5
31810:0,2:3309,5
39970:0,25:4900
48360:0,3:6898,5
55790:0,35:9316,5
92970:0,4:12106
127860:0,45:16754,5
151250:0,5:23147,5
172040:0,55:30710
195000:0,6:39312
0:0,65:49062
4.8. کلاس StreamWriter
کلاس StreamWriter به شما امکان میدهد تا در یک فایل بنویسید. در اینجا برخی از ویژگیها و متدهای آن آورده شده است:
یک جریان نوشتن از مسیر فایل باز میکند. اگر فایل قابل ایجاد نباشد، یک استثنا پرتاب میشود. | |
اگر روی true تنظیم شود، نوشتن در استریم از طریق بافر انجام نمیشود؛ در غیر این صورت، نوشتن در استریم فوری نخواهد بود: دادهها ابتدا در یک بافر نوشته میشوند و سپس هنگامی که بافر پر شود، به استریم نوشته میشوند. به طور پیشفرض، حالت بافر شده استفاده میشود. این حالت برای استریمهای فایل مناسب است اما به طور کلی برای استریمهای شبکه مناسب نیست. | |
برای تعیین یا مشخص کردن کاراکتر پایان خط مورد استفاده توسط متد WriteLine | |
جریان را میبندد | |
یک خط را به جریان خروجی مینویسد | |
فایل بافر را به استریم مینویسد |
مثال زیر را در نظر بگیرید:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Imports System.IO
Module test
Sub Main()
Dim ligne As String = Nothing ' une ligne de texte
Dim fluxInfos As StreamWriter = Nothing ' le fichier texte
Try
'ایجاد یک فایل متنی
fluxInfos = New StreamWriter("infos.txt")
' خواندن یک خط تایپشده روی صفحهکلید
Console.Out.Write("ligne (rien pour arrêter) : ")
ligne = Console.In.ReadLine().Trim()
' حلقه تا زمانی که خط وارد شده خالی نباشد
While ligne <> ""
'نوشتن یک خط در یک فایل متنی
fluxInfos.WriteLine(ligne)
'خواندن خط جدید از صفحهکلید
Console.Out.Write("ligne (rien pour arrêter) : ")
ligne = Console.In.ReadLine().Trim()
End While
Catch e As Exception
System.Console.Error.WriteLine("L'erreur suivante s'est produite : " & e.ToString)
Finally
' بستن فایل
Try
fluxInfos.Close()
Catch
End Try
End Try
End Sub
End Module
و نتایج اجرای آن:
dos>file2
ligne (rien pour arrêter) : ligne1
ligne (rien pour arrêter) : ligne2
ligne (rien pour arrêter) : ligne3
ligne (rien pour arrêter) :
dos>more infos.txt
ligne1
ligne2
ligne3
4.9. کلاس Regex
کلاس Regex امکان استفاده از عبارتهای منظم را فراهم میکند. اینها به شما اجازه میدهند تا قالب یک رشته را اعتبارسنجی کنید. به عنوان مثال، میتوانید بررسی کنید که یک رشته که نشاندهنده یک تاریخ است، واقعاً در قالب dd/mm/yy باشد. برای این کار، شما از یک الگو استفاده کرده و رشته را با آن الگو مقایسه میکنید. در این مثال، d، m و y باید اعداد باشند. الگوی یک فرمت تاریخ معتبر بنابراین «\d\d/\d\d/\d\d» است، که در آن نماد \d نشاندهنده یک رقم است. نمادهایی که میتوان در یک الگو استفاده کرد به شرح زیر است (مستندات مایکروسافت):
توضیحات | |
کاراکترهای زیر را به عنوان کاراکتر ویژه یا متن مطلق علامتگذاری کنید. برای مثال، «n» با کاراکتر «n» مطابقت دارد. «\n» با کاراکتر خط جدید مطابقت دارد. توالی «\\» با «\» مطابقت دارد، در حالی که «\(" با «(» مطابقت دارد. | |
با شروع ورودی مطابقت دارد. | |
نماینده پایان ورودی است. | |
با کاراکتر قبلی صفر یا چند بار مطابقت دارد. بنابراین، 'zo*' با 'z' یا 'zoo' مطابقت دارد. | |
با کاراکتر قبلی یک یا چند بار مطابقت دارد. بنابراین، «zo+» با «zoo» مطابقت دارد، اما با «z» مطابقت ندارد. | |
با کاراکتر قبلی صفر یا یک بار مطابقت میدهد. برای مثال، «a?ve?» با «ve» در «lever» مطابقت دارد. | |
با هر کاراکتر واحدی مطابقت دارد، به جز کاراکتر خط جدید. | |
| جستجو برای modèle و ذخیره تطبیق. زیر رشتهی تطبیقشده را میتوان از مجموعه Matches حاصل با استفاده از آیتم [0]...[n] استخراج کرد. برای یافتن تطابقهایی که شامل کاراکترها در داخل پرانتز ( ) هستند، از "(" یا ")" استفاده کنید. |
| مطابقت میکند با x یا y. برای مثال، "z|foot" با "z" یا "foot" مطابقت دارد. "(z|f)oo" با "zoo" یا "foo" مطابقت دارد. |
| n یک عدد صحیح غیرمنفی است. دقیقاً به همان تعداد n بار با کاراکتر مطابقت دارد. برای مثال، «o{2}» با «o» در «Bob» مطابقت ندارد، اما با دو «o» اول در «fooooot» مطابقت دارد. |
| n یک عدد صحیح غیرمنفی است. این عبارت حداقل به n بار با این کاراکتر مطابقت دارد. برای مثال، «o{2,}» با «o» در «Bob» مطابقت ندارد، اما با تمام «o»ها در «fooooot» مطابقت دارد. «o{1,}» معادل «o+» و «o{0,}» معادل «o*» است. |
| m و n اعداد صحیح غیرمنفی هستند. با کاراکتر حداقل n و حداکثر m بار مطابقت میدهد. برای مثال، «o{1,3}» با سه «o» اول در «foooooot» مطابقت دارد و «o{0,1}» معادل «o؟» است. |
| مجموعه کاراکتر. یکی از کاراکترهای مشخصشده را مطابقت میدهد. برای مثال، «[abc]» با «a» در «plat» مطابقت دارد. |
| مجموعه کاراکتر منفی. با هر کاراکتری که در لیست ذکر نشده مطابقت دارد. برای مثال، "[^abc]" با "p" در "plat" مطابقت دارد. |
| محدوده کاراکتری. با هر کاراکتری که در محدوده مشخص شده باشد مطابقت دارد. برای مثال، "[a-z]" با هر کاراکتر الفبایی کوچک بین "a" و "z" مطابقت دارد. |
| محدوده کاراکتری منفی. با هر کاراکتری مطابقت دارد که در محدوده مشخصشده یافت نشود. برای مثال، «[^m-z]» با هر کاراکتری مطابقت دارد که بین «m» و «z» یافت نشود. |
مطابقت میدهد با مرز کلمه، یعنی موقعیت بین یک کلمه و یک فاصله. برای مثال، «er\b» با «er» در «lever» مطابقت دارد، اما با «er» در «verbe» مطابقت ندارد. | |
یک مرز را مطابقت میدهد که نمایانگر یک کلمه نیست. «en*t\B» با «ent» در «bien entendu» مطابقت دارد. | |
با یک کاراکتر نمایانگر یک رقم مطابقت دارد. معادل [0-9] است. | |
مطابقت میدهد با یک کاراکتر که نمایانگر یک رقم نیست. معادل [^0-9] است. | |
مطابق با یک کاراکتر شکست صفحه است. | |
مطابقت دارد با کاراکتر پایان خط. | |
مطابق با کاراکتر بازگشت به خانه است. | |
مطابقت دارد با هر فضای خالی، از جمله فاصلهها، تبها، شکست صفحات و غیره. معادل "[ \f\n\r\t\v]". | |
هر کاراکتر غیرفاصلهای را مطابقت میدهد. معادل "[^ \f\n\r\t\v]". | |
با کاراکتر تب مطابقت دارد. | |
با کاراکتر تب عمودی مطابقت دارد. | |
مطابقت دارد با هر کاراکتری که یک کلمه را نشان میدهد و شامل خط تیره زیرین (_) است. معادل "[A-Za-z0-9_]". | |
مطابقت دارد با هر کاراکتری که نمایانگر یک کلمه نباشد. معادل "[^A-Za-z0-9_]". | |
| مطابق با num است، که در آن num یک عدد صحیح مثبت است. به نگاشتهای ذخیرهشده اشاره میکند. به عنوان مثال، «(.)\1» با دو کاراکتر متوالی یکسان مطابقت دارد. |
| مطابقت دارد با n، که در آن n یک مقدار فرار اکتال است. مقادیر فرار اکتال باید شامل ۱، ۲ یا ۳ رقم باشند. به عنوان مثال، «\11» و «\011» هر دو به یک کاراکتر تب (tab) مطابقت دارند. "\0011" معادل "\001" و "1" است. مقادیر فرار اکتال نباید از ۲۵۶ تجاوز کنند. اگر این اتفاق بیفتد، تنها دو رقم اول در عبارت در نظر گرفته میشوند. به کدهای ASCII اجازه میدهد تا در عبارات باقاعده استفاده شوند. |
| مطابق با n است، که در آن n یک مقدار فرار هگزادسیمال است. مقادیر فرار هگزادسیمال باید از دو رقم تشکیل شوند. به عنوان مثال، "\x41" معادل "A" است. "\x041" معادل "\x04" و "1" است. امکان استفاده از کدهای ASCII در عبارتهای منظم را فراهم میکند. |
یک عنصر در یک قالب ممکن است یک یا چند بار ظاهر شود. بیایید به چند مثال مربوط به نماد \d که نماینده یک رقم است، نگاهی بیندازیم:
مدل | معنی |
یک عدد | |
۰ یا ۱ رقم | |
۰ یا بیشتر رقم | |
۱ یا چند رقم | |
۲ رقم | |
حداقل ۳ رقم | |
بین ۵ تا ۷ رقم |
حال بیایید مدلی را در نظر بگیریم که قادر به توصیف فرمت مورد انتظار برای یک رشته باشد:
رشته مقصد | الگو |
\d{2}/\d{2}/\d{2} | |
\d{2}:\d{2}:\d{2} | |
\d+ | |
\s* | |
\s*\d+\s* | |
\s*[+|-]?\s*\d+\s* | |
\s*\d+(.\d*)?\s* | |
\s*[+|]?\s*\d+(.\d*)?\s* | |
\bjust\b | |
میتوانید مشخص کنید که الگو را در کجای رشته جستجو کنید:
الگو | به معنای |
قالب شروع رشته را مشخص میکند | |
قالب رشته را پایان میدهد | |
قالب رشته را شروع و پایان میدهد | |
الگو در هر نقطهای از رشته، از ابتدا جستجو میشود. |
مطالعهٔ رشته | الگو |
!$ | |
\.$ | |
^// | |
^\s*\w+\s*$ | |
^\s*\w+\s*\w+\s*$ | |
\bsecret\b |
زیرالگوها در یک الگو را میتوان «استخراج» کرد. این بدان معناست که نه تنها میتوانیم بررسی کنیم که آیا یک رشته با الگوی خاصی مطابقت دارد، بلکه میتوانیم عناصر متناظر با زیرالگوهای الگو که در کروشهها قرار گرفتهاند را از آن رشته استخراج کنیم. برای مثال، اگر در حال تحلیل رشتهای هستیم که تاریخ را به فرمت dd/mm/yy دارد و همچنین میخواهیم عناصر dd، mm و yy را از آن تاریخ استخراج کنیم، از الگوی (\d\d)/(\d\d)/(\d\d) استفاده خواهیم کرد.
4.9.1. بررسی اینکه آیا یک رشته با یک الگوی دادهشده مطابقت دارد
یک شیء Regex به صورت زیر ساخته میشود:
سازنده یک شیء «بیان منظم» را از الگویی که بهعنوان پارامتر ارسال شده است ایجاد میکند. پس از ساخت الگوی بیان منظم، میتوان آن را با استفاده از متد IsMatch با رشتههای کاراکتری مقایسه کرد:
IsMatch در صورتی که رشته ورودی با الگوی عبارت منظم مطابقت داشته باشد، مقدار true را برمیگرداند. در اینجا یک مثال آورده شده است:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions
Module regex1
Sub Main()
' یک الگوی عبارت منظم
Dim modèle1 As String = "^\s*\d+\s*$"
Dim regex1 As New Regex(modèle1)
' مقایسه یک نمونه با الگو
Dim exemplaire1 As String = " 123 "
If regex1.IsMatch(exemplaire1) Then
affiche(("[" + exemplaire1 + "] correspond au modèle [" + modèle1 + "]"))
Else
affiche(("[" + exemplaire1 + "] ne correspond pas au modèle [" + modèle1 + "]"))
End If
Dim exemplaire2 As String = " 123a "
If regex1.IsMatch(exemplaire2) Then
affiche(("[" + exemplaire2 + "] correspond au modèle [" + modèle1 + "]"))
Else
affiche(("[" + exemplaire2 + "] ne correspond pas au modèle [" + modèle1 + "]"))
End If
End Sub
' نمایشها
Sub affiche(ByVal msg As String)
Console.Out.WriteLine(msg)
End Sub
End Module
و نتایج اجرا:
dos>vbc /r:system.dll regex1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573
dos>regex1
[ 123 ] correspond au modèle [^\s*\d+\s*$]
[ 123a ] ne correspond pas au modèle [^\s*\d+\s*$]
4.9.2. تمام عناصری را که با یک الگو مطابقت دارند در یک رشته پیدا کنید
متد Matches
مجموعهای از عناصر رشته input را که با الگو مطابقت دارند بازمیگرداند، همانطور که در مثال زیر نشان داده شده است:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions
Module regex2
Sub Main()
' چندین وقوع الگو در نمونه
Dim modèle2 As String = "\d+"
Dim regex2 As New Regex(modèle2) '
Dim exemplaire3 As String = " 123 456 789 "
Dim résultats As MatchCollection = regex2.Matches(exemplaire3)
affiche(("Modèle=[" + modèle2 + "],exemplaire=[" + exemplaire3 + "]"))
affiche(("Il y a " & résultats.Count & " occurrences du modèle dans l'exemplaire "))
Dim i As Integer
For i = 0 To résultats.Count - 1
affiche((résultats(i).Value & " en position " & résultats(i).Index))
Next i
End Sub
'نمایشها
Sub affiche(ByVal msg As String)
Console.Out.WriteLine(msg)
End Sub
End Module
کلاس MatchCollection دارای خاصیت Count است که تعداد عناصر مجموعه را نشان میدهد. اگر résultats یک نمونه از MatchCollection باشد، آنگاه résultats(i) عنصر i-ام آن مجموعه است و از نوع Match میباشد. در مثال ما، résultats مجموعهای از عناصر در رشته exemplaire3 است که با مدل modèle2 مطابقت دارند، و résultats(i) یکی از این عناصر است. کلاس Match دو ویژگی مورد توجه در اینجا دارد:
- Value: مقدار شیء Match، یعنی عنصری که با الگو مطابقت دارد
- Index: موقعیتی که عنصر در رشته در حال اسکن در آن یافت شده است
نتایج اجرای برنامه قبلی:
dos>vbc /r:system.dll regex2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4p our Microsoft (R) .NET Framework version 1.1.4322.573
dos>regex2
Modèle=[\d+],exemplaire=[ 123 456 789 ]
Il y a 3 occurrences du modèle dans l'exemplaire
123 en position 2
456 en position 7
789 en position 12
4.9.3. استخراج بخشهایی از یک الگو
زیرالگوهای یک الگو را میتوان «استخراج» کرد. این بدان معناست که نه تنها میتوانیم بررسی کنیم که آیا یک رشته با الگوی خاصی مطابقت دارد، بلکه میتوانیم عناصر مربوط به زیرالگوهای الگو که در داخل پرانتز قرار گرفتهاند را از آن رشته استخراج کنیم. برای مثال، اگر در حال تحلیل رشتهای هستید که شامل تاریخی به فرمت dd/mm/yy است و همچنین میخواهید عناصر dd، mm و yy را از آن تاریخ استخراج کنید، از الگوی (\d\d)/(\d\d)/(\d\d) استفاده میکنید. بیایید به مثال زیر نگاه کنیم:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions
Module regex2
Sub Main()
' عناصر ضبطشده در قالب
Dim modèle3 As String = "(\d\d):(\d\d):(\d\d)"
Dim regex3 As New Regex(modèle3)
Dim exemplaire4 As String = "Il est 18:05:49"
'اعتبارسنجی قالب
Dim résultat As Match = regex3.Match(exemplaire4)
If résultat.Success Then
' نسخهٔ کپی با الگو مطابقت دارد
affiche(("L'exemplaire [" + exemplaire4 + "] correspond au modèle [" + modèle3 + "]"))
'گروهها نمایش داده میشوند
Dim i As Integer
For i = 0 To résultat.Groups.Count - 1
affiche(("groupes[" & i & "]=[" & résultat.Groups(i).Value & "] en position " & résultat.Groups(i).Index))
Next i
Else
' مثال با قالب مطابقت ندارد
affiche(("L'exemplaire[" + exemplaire4 + " ne correspond pas au modèle [" + modèle3 + "]"))
End If
End Sub
'نمایش میدهد
Sub affiche(ByVal msg As String)
Console.Out.WriteLine(msg)
End Sub
End Module
اجرای این برنامه نتایج زیر را تولید میکند:
dos>vbc /r:system.dll regex3.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>regex3
L'exemplaire [Il est 18:05:49] correspond au modèle [(\d\d):(\d\d):(\d\d)]
groupes[0]=[18:05:49] en position 7
groupes[1]=[18] en position 7
groupes[2]=[05] en position 10
groupes[3]=[49] en position 13
تغییر در بخش زیرین کد است:
' بررسی قالب
Dim résultat As Match = regex3.Match(exemplaire4)
If résultat.Success Then
' مثال با قالب مطابقت دارد
affiche(("L'exemplaire [" + exemplaire4 + "] correspond au modèle [" + modèle3 + "]"))
'گروهها نمایش داده میشوند
Dim i As Integer
For i = 0 To résultat.Groups.Count - 1
affiche(("groupes[" & i & "]=[" & résultat.Groups(i).Value & "] en position " & résultat.Groups(i).Index))
Next i
Else
رشته exemplaire4 در مقابل قالب regex3 با استفاده از روش Match مقایسه میشود. این یک شیء Match را بازمیگرداند که قبلاً توصیف شده است. در اینجا از دو ویژگی جدید این کلاس استفاده میکنیم:
- Success: نشان میدهد که آیا تطابق یافت شده است
- Groups: یک مجموعه که
- Groups[0] متناظر با بخشی از رشته است که با الگو مطابقت دارد
- Groups[i] (i>=1) معادل مجموعه i-ام کروشهها است
اگر نتیجه از نوع Match باشد، résultats.Groups از نوع GroupCollection و résultats.Groups[i] از نوع Group است. کلاس Group دارای دو خاصیت است که در اینجا از آنها استفاده میکنیم:
- Value: مقدار شیء گروه متناظر با عنصر در داخل پرانتز
- Index: موقعیتی که عنصر در رشته در حال تجزیه در آن یافت شده است
4.9.4. یک برنامه آموزشی
یافتن عبارت منظم (regular expression) که به ما امکان میدهد بررسی کنیم آیا یک رشته با الگوی خاصی مطابقت دارد یا خیر، گاهی اوقات میتواند یک چالش واقعی باشد. برنامه زیر به شما امکان میدهد تمرین کنید. این برنامه از شما یک الگو و یک رشته میخواهد و سپس نشان میدهد که آیا آن رشته با الگو مطابقت دارد یا خیر.
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions
Imports Microsoft.visualbasic
Module regex4
Sub Main()
' یک عبارت منظم قالب
Dim modèle, chaine As String
Dim regex As Regex = Nothing
Dim résultats As MatchCollection
' از کاربر خواسته میشود قالبها و نمونههایی را که باید با این مورد مقایسه شوند، مشخص کند
Dim terminé1 As Boolean = False
Do While Not terminé1
Dim erreur As Boolean = True
Do While Not terminé1 And erreur
'قالب درخواست میشود
Console.Out.Write("Tapez le modèle à tester ou fin pour arrêter :")
modèle = Console.In.ReadLine()
' انجام شد؟
If modèle.Trim().ToLower() = "fin" Then
terminé1 = True
Else
'الگوی عبارت منظم ایجاد شد
Try
regex = New Regex(modèle)
erreur = False
Catch ex As Exception
Console.Error.WriteLine(("Erreur : " + ex.Message))
End Try
End If
Loop
' تمام شد؟
If terminé1 Then Exit Sub
'از کاربر خواسته میشود نمونههایی را که باید با الگو مقایسه شوند، انتخاب کند
Dim terminé2 As Boolean = False
Do While Not terminé2
Console.Out.Write(("Tapez la chaîne à comparer au modèle [" + modèle + "] ou fin pour arrêter :"))
chaine = Console.In.ReadLine()
'انجام شد؟
If chaine.Trim().ToLower() = "fin" Then
terminé2 = True
Else
' مقایسه را انجام دهید
résultats = regex.Matches(chaine)
' موفق بود؟
If résultats.Count = 0 Then
Console.Out.WriteLine("Je n'ai pas trouvé de correspondances")
Else
' عناصر مطابقتیافته با الگو نمایش داده میشوند
Dim i As Integer
For i = 0 To résultats.Count - 1
Console.Out.WriteLine(("J'ai trouvé la correspondance [" & résultats(i).Value & "] en position " & résultats(i).Index))
'زیرعنصرها
If résultats(i).Groups.Count <> 1 Then
Dim j As Integer
For j = 1 To (résultats(i).Groups.Count) - 1
Console.Out.WriteLine((ControlChars.Tab & "sous-élément [" & résultats(i).Groups(j).Value & "] en position " & résultats(i).Groups(j).Index))
Next j
End If
Next i
End If
End If
Loop
Loop
End Sub
'نمایش میدهد
Sub affiche(ByVal msg As String)
Console.Out.WriteLine(msg)
End Sub
End Module
در اینجا مثالی از اجرای برنامه آورده شده است:
Tapez le modèle à tester ou fin pour arrêter :\d+
Tapez la chaîne à comparer au modèle [\d+] ou fin pour arrêter :123 456 789
J'ai trouvé la correspondance [123] en position 0
J'ai trouvé la correspondance [456] en position 4
J'ai trouvé la correspondance [789] en position 8
Tapez la chaîne à comparer au modèle [\d+] ou fin pour arrêter :fin
Tapez le modèle à tester ou fin pour arrêter :(\d\d):(\d\d)
Tapez la chaîne à comparer au modèle [(\d\d):(\d\d)] ou fin pour arrêter :14:15 abcd 17:18 xyzt
J'ai trouvé la correspondance [14:15] en position 0
sous-élément [14] en position 0
sous-élément [15] en position 3
J'ai trouvé la correspondance [17:18] en position 11
sous-élément [17] en position 11
sous-élément [18] en position 14
Tapez la chaîne à comparer au modèle [(\d\d):(\d\d)] ou fin pour arrêter :fin
Tapez le modèle à tester ou fin pour arrêter :^\s*\d+\s*$
Tapez la chaîne à comparer au modèle [^\s*\d+\s*$] ou fin pour arrêter : 1456
J'ai trouvé la correspondance [ 1456] en position 0
Tapez la chaîne à comparer au modèle [^\s*\d+\s*$] ou fin pour arrêter :fin
Tapez le modèle à tester ou fin pour arrêter :^\s*(\d+)\s*$
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :1456
J'ai trouvé la correspondance [1456] en position 0
sous-élément [1456] en position 0
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :abcd 1
456
Je n'ai pas trouvé de correspondances
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :fin
Tapez le modèle à tester ou fin pour arrêter :fin
4.9.5. متد Split
ما قبلاً این متد را در کلاس String دیدهایم:
این رشته بهعنوان دنبالهای از فیلدها در نظر گرفته میشود که با کاراکترهای موجود در آرایه [separator] از هم جدا شدهاند. نتیجه، آرایهای از این فیلدها است.
جداساز میدان در رشته یکی از کاراکترهای موجود در آرایه separator است. متد Split از کلاس Regex به ما امکان میدهد جداکننده را بر اساس یک الگو مشخص کنیم:
مجموعه کاراکتری [input] به فیلدها تقسیم میشود که توسط جداکنندهای که متناسب با قالب شیء فعلی Regex است، از هم جدا شدهاند. برای مثال فرض کنید که ما در یک فایل متنی خطوطی به شکل field1, field2, …, fieldn داریم. فیلدها با یک ویرگول از هم جدا شدهاند، اما ممکن است قبل یا بعد از آن فاصلهها قرار داشته باشد. بنابراین متد Split از کلاس string مناسب نیست. متد RegEx راهحل را ارائه میدهد. اگر line خط خواندهشده باشد، فیلدها را میتوان با استفاده از
همانطور که در مثال زیر نشان داده شده است:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Text.RegularExpressions
Module regex5
Sub Main()
'یک خط
Dim ligne As String = "abc , def , ghi"
' یک قالب
Dim modèle As New Regex("\s*,\s*")
' تفکیک خط به فیلدها
Dim champs As String() = modèle.Split(ligne)
' نمایش
Dim i As Integer
For i = 0 To champs.Length - 1
Console.Out.WriteLine(("champs[" & i & "]=[" & champs(i) & "]"))
Next i
End Sub
End Module
نتایج اجرا:
dos>vbc /r:system.dll regex5.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>regex5
champs[0]=[abc]
champs[1]=[def]
champs[2]=[ghi]
4.10. کلاسهای BinaryReader و BinaryWriter
کلاسهای BinaryReader و BinaryWriter برای خواندن و نوشتن فایلهای باینری استفاده میشوند. برنامهی زیر را در نظر بگیرید. ما میخواهیم برنامهای بنویسیم که به صورت زیر فراخوانی شود:
// pg متن bin سینتکس
// یک فایل متنی را بخوانید (متن) و محتویات آن را در یک
// فایل باینری
// فایل متنی شامل خطوطی به شکل نام : سن است
//که در ساختاری شامل رشتهها و اعداد صحیح ذخیره خواهد شد
فایل متنی حاوی موارد زیر است:
برنامه به شرح زیر است:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Text.RegularExpressions
Imports System.IO
' BinaryWriter()
Module bw1
' pg syntax text bin
' یک فایل متنی را بخوانید (متن) و محتویات آن را در یک
' فایل باینری
' فایل متنی شامل خطوطی به شکل نام : سن است
' که در یک ساختار شامل یک رشته و یک عدد صحیح ذخیره خواهد شد
Sub Main(ByVal arguments() As String)
' دو آرگومان لازم است
Dim nbArgs As Integer = arguments.Length
If nbArgs <> 2 Then
Console.Error.WriteLine("syntaxe : pg texte binaire")
Environment.Exit(1)
End If
' باز کردن فایل متنی برای خواندن
Dim input As StreamReader = Nothing
Try
input = New StreamReader(arguments(0))
Catch ex As Exception
Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(0) & "(" & ex.Message & ")")
Environment.Exit(2)
End Try
' فایل باینری را برای نوشتن باز کنید
Dim output As BinaryWriter = Nothing
Try
output = New BinaryWriter(New FileStream(arguments(1), FileMode.Create, FileAccess.Write))
Catch ex As Exception
Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(1) & "(" & ex.Message & ")")
Environment.Exit(3)
End Try
' خواندن فایل متنی – نوشتن فایل باینری
' خط فایل متنی
Dim ligne As String
' جداساز میدان در خط
Dim séparateur As New Regex("\s*:\s*")
' قالب سن
Dim modAge As New Regex("\s*\d+\s*")
Dim numLigne As Integer = 0
Dim traitementFini As Boolean
Dim champs As String()
ligne = input.ReadLine()
While Not (ligne Is Nothing)
traitementFini = False
' خط خالی؟
If ligne.Trim() = "" Then
traitementFini = True
End If
' یک خط دیگر
If Not traitementFini Then
numLigne += 1
'یک خط: نام : سن
champs = séparateur.Split(ligne)
' ما به ۲ فیلد نیاز داریم
If champs.Length <> 2 Then
Console.Error.WriteLine(("La ligne n° " & numLigne & " du fichier " & arguments(0) & " a un nombre de champs incorrect"))
' خط بعدی
traitementFini = True
End If
End If
If Not traitementFini Then
' میدان دوم باید یک عدد صحیح ≥۰ باشد
If Not modAge.IsMatch(champs(1)) Then
Console.Error.WriteLine(("La ligne n° " & numLigne & " du fichier " & arguments(0) & " a un âge incorrect"))
' خط بعدی
traitementFini = True
End If
' دادهها را در فایل دودویی مینویسیم
output.Write(champs(0))
output.Write(Integer.Parse(champs(1)))
End If
'خط بعدی
ligne = input.ReadLine()
End While
' بستن فایلها
input.Close()
output.Close()
End Sub
End Module
بیایید بر عملیات مربوط به کلاس BinaryWriter تمرکز کنیم:
- شیء BinaryWriter توسط عملیات باز میشود
output = New BinaryWriter(New FileStream(arguments(1), FileMode.Create, FileAccess.Write))
آرگومان سازنده باید یک استریم باشد. در اینجا، این استریم از یک فایل (FileStream) ساخته شده است که برای آن فراهم میکنیم:
- (ادامه)
- نام
- عملی که باید انجام شود، در این مورد FileMode.Create برای ایجاد فایل
- نوع دسترسی، در اینجا FileAccess.Write برای دسترسی نوشتاری به فایل
- عملیات نوشتن
' نوشتن دادهها به فایل دودویی
output.Write(champs(0))
output.Write(Integer.Parse(champs(1)))
کلاس BinaryWriter دارای متدهای مختلفی است که بازنویسی شدهاند (Write) برای نوشتن انواع مختلف دادههای ساده
- عملیات بستن استریم
نتایج اجرای قبلی توسط برنامهٔ زیر ارائه خواهد شد. این برنامه همچنین دو آرگومان را میپذیرد:
' pg bin text syntax
'یک فایل باینری 'bin' را میخواند و محتویات آن را در یک فایل متنی ('text') ذخیره میکند
' فایل باینری دارای ساختاری متشکل از رشتهها و اعداد صحیح است
' فایل متنی شامل خطوطی به شکل نام : سن است
بنابراین عملیات معکوس را انجام میدهیم. یک فایل باینری را میخوانیم تا یک فایل متنی ایجاد کنیم. اگر فایل متنی حاصل با فایل اصلی یکسان باشد، خواهیم دانست که تبدیل متن ← باینری ← متن با موفقیت انجام شده است. کد به شرح زیر است:
' گزینهها
Option Strict On
Option Explicit On
' فضاهای نام
Imports System
Imports System.Text.RegularExpressions
Imports System.IO
Module br1
' pg bin text syntax
' یک فایل باینری «bin» را بخوانید و محتویات آن را در یک فایل متنی («text») ذخیره کنید
' فایل باینری دارای ساختاری متشکل از رشتهها و اعداد صحیح است
' فایل متنی شامل خطوطی به شکل نام : سن است
Sub Main(ByVal arguments() As String)
' دو آرگومان لازم است
Dim nbArgs As Integer = arguments.Length
If nbArgs <> 2 Then
Console.Error.WriteLine("syntaxe : pg binaire texte")
Environment.Exit(1)
End If
' فایل باینری را برای خواندن باز کنید
Dim dataIn As BinaryReader = Nothing
Try
dataIn = New BinaryReader(New FileStream(arguments(0), FileMode.Open, FileAccess.Read))
Catch ex As Exception
Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(0) & "(" & ex.Message & ")")
Environment.Exit(2)
End Try
' باز کردن فایل متنی برای نوشتن
Dim dataOut As StreamWriter = Nothing
Try
dataOut = New StreamWriter(arguments(1))
dataOut.AutoFlush = True
Catch ex As Exception
Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(1) & "(" & ex.Message & ")")
Environment.Exit(3)
End Try
' خواندن فایل باینری – نوشتن فایل متنی
Dim nom As String ' nom d'une personne
Dim age As Integer ' son âge
'حلقه برای پردازش فایل باینری
While True
' خواندن نام
Try
nom = dataIn.ReadString()
Catch
' پایان فایل
Exit Sub
End Try
' خواندن سن
Try
age = dataIn.ReadInt32()
Catch
Console.Error.WriteLine("Le fichier " & arguments(0) + " ne semble pas avoir un format correct")
Exit Sub
End Try
' نوشتن در فایل متنی
dataOut.WriteLine(nom & ":" & age)
System.Console.WriteLine(nom & ":" & age)
End While
' بستن همه چیز
dataIn.Close()
dataOut.Close()
End Sub
End Module
بیایید نگاهی دقیقتر به عملیات مربوط به کلاس BinaryReader بیندازیم:
- شیء BinaryReader توسط عملیات باز میشود
dataIn = New BinaryReader(New FileStream(arguments(0), FileMode.Open, FileAccess.Read))
آرگومان سازنده باید یک استریم باشد. در اینجا، این یک استریم ساختهشده از یک فایل (FileStream) است که برای آن فراهم میکنیم:
- (ادامه)
- نام
- عملی که باید انجام شود، در این مورد FileMode.Open برای باز کردن یک فایل موجود
- نوع دسترسی، در اینجا FileAccess.Read برای دسترسی خواندنی به فایل
- عملیات خواندن
کلاس BinaryReader دارای متدهای مختلفی مانند ReadXX برای خواندن انواع مختلف دادههای ساده است
- عملیات بستن استریم
اگر این دو برنامه را پشت سر هم اجرا کنیم، یعنی personnes.txt را به personnes.bin و سپس personnes.bin را به personnes.txt2 تبدیل کنیم، نتیجه به این صورت خواهد بود:

