MCTS Programming

www.SarafMoghadam.Com

MCTS Programming

www.SarafMoghadam.Com

متغیر های Generic Collections

برای استفاده از generic collections ممکن است که نیاز به رابط هایی داشته باشم

مانند Sort کردن ListArray که نیاز به IComparable دارد.

این مبحث را فردا کامل میکنم


    Public Class person
        Implements IComparable
        Private firstName As String
        Private lastName As String
        Public Function CompareTo(ByVal obj As Object) _
        As Integer Implements System.IComparable.CompareTo
            Dim otherPerson As person = DirectCast(obj, person)
            If Me.lastName <> otherPerson.lastName Then
                Return Me.lastName.CompareTo(otherPerson.lastName)
            Else
                Return Me.firstName.CompareTo(otherPerson.firstName)
            End If
        End Function
        Public Sub New(ByVal _firstName As String, ByVal _lastName As String)
            firstName = _firstName
            lastName = _lastName
        End Sub
        Public Overrides Function ToString() As String
            Return firstName + " " + lastName
        End Function
    End Class



Dim l As New List(Of person)()
        l.Add(New person("Mark", "Hanson"))
        l.Add(New person("Kim", "Akers"))
        l.Add(New person("Zsolt", "Ambrus"))
        l.Sort()
        For Each p As person In l
            Console.WriteLine(p.ToString())
        Next

مثال استفاده از ArrayList

ساخت کارت فروش فروشگاهی با استفاده از ArrayList

بعد از ساخت پروژه جدید و اضافه کردن یک Button و یک ListBox به فرم اصلی یک کلاس به نام ShoppingCartItem به صورت زیر درست میکنیم


Public Class ShoppingCartItem
     Public itemName As String
     Public price As Double
     Public Sub New(ByVal _itemName As String, ByVal _price As Double)
          Me.itemName = _itemName
          Me.price = _price
     End Sub
End Class


namespace زیر را به فرم اصلی برنامه اضافه میکنیم:

Imports System.Collections


در رویداد کلیک دکمه اضافه شده به فرم کد های زیر را مینویسم



Dim shoppingCart As New ArrayList()

shoppingCart.Add(New ShoppingCartItem("Car", 5000))
shoppingCart.Add(New ShoppingCartItem("Book", 30))

shoppingCart.Add(New ShoppingCartItem("Phone", 80))
shoppingCart.Add(New ShoppingCartItem("Computer", 1000))
For Each
sci As ShoppingCartItem In shoppingCart
     Listbox1.Items.Add(sci.itemName & ": " & sci.price.ToString())
Next


خروجی به شکل زیر خواهد بود:



حالا برای مرتب کردن ( Sort ) هم باید از رابط (اینترفیس) IComparable استفاده کنیم، کلاس خود را به شکل زیر تبدیل میکنیم


Public Class ShoppingCartItem
    Implements IComparable
    Public itemName As String
    Public price As Double
    Public Sub New(ByVal _itemName As String, ByVal _price As Double)
        Me.itemName = _itemName
        Me.price = _price
    End Sub
    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
        Dim otherItem As ShoppingCartItem = DirectCast(obj, ShoppingCartItem)
        Return Me.price.CompareTo(otherItem.price)
    End Function
End Class

مرتب سازی بر اساس price است.

حال میتوانیم در برنامه اصلی آیتم های خود را از کوچک به بزرگ و یا بزرگ به گوچک مرتب کنیم


shoppingCart.Sort()

shoppingCart.Reverse()

متغیرهای Dictionaries

نوعی متغیر است که به اعضای آن میتوان کلید اختصاص داد و انواع مختلفی دارد:


  • Hashtable ( قابل بازیابی از طریق نام و ایندکس )
  • SortedList ( به صورت اتوماتیک بر اساس کلیدها مرتب میشود )
  • StringDictionary (نوعی هش تیبل که قدرت زیادی برای رشته های حرفی دارد)
  • ListDictionary ( بهینه سازی شده برای کمتر از 10 آیتم )
  • HybridDictionary (از لیست دیکشنری استفاده می کند و در صورت افزایش هش تیبل میشود)
  • NameValueCollection ( بازیابی توسط اسم و ایندکس )

'SortedList


Dim sl As New SortedList()

sl.Add("1", "First")
sl.Add("3", "Second")
sl.Add("2", "Third")
For Each de As DictionaryEntry In sl
     ListBox1.Items.Add(de.Value)
Next

Key کلید و Value مقدار یه خانه است.

خروجی را مرتب کرده و به صورت زیر به ListBox1 اضافه میکند

( مرتب سازی روی حروف الفبا نیز میباشد )

First

Third

Second


نحوه دستیابی به خانه های حافظه از نوع SortedList

MsgBox(sl("3"))
MsgBox(sl.GetByIndex(0))


'Hashtable


Dim HT As New Hashtable()
HT.Add("nima", "09118970987")
HT.Add("pouyan", "091234538")
HT.Add("shadi", "0913234566")
HT.Add("nansi", "0919789400")


For Each h As DictionaryEntry In HT
     ListBox1.Items.Add(h.Key)
     ListBox2.Items.Add(h.Value)
Next

هش تیبل فقط میتواند کلید منحصر به فرد داشته باشد

اگر بخواهیم که کلید، منحصر به فرد نباشد از نیم ولیو کالکشن استفاده میکنیم.


'NameValueCollection


Dim sl As New NameValueCollection()

sl.Add("Stack", "Represents a LIFO collection of objects.")
sl.Add("Stack", "A pile of pancakes.")
sl.Add("Queue", "Represents a FIFO collection of objects.")
sl.Add("Queue", "In England, a line.")
sl.Add("SortedList", "Represents a collection of key/value pairs.")
For Each s As String In sl.GetValues(0)
     ListBox1.Items.Add(s)
Next
For Each s As String In sl.GetValues("Queue")
     ListBox2.Items.Add(s)
Next


همانطور که میبینید در NameValueCollection میتوانیم چندین کلید یکی داشته باشیم

آرایه ای از بیت ها BitArray و BitVector32

لینک کمکی به MSDN برای BitArray

آرایه بیتی ، آرایه ای از Boolean ها است

نحوه تعریف آرایه بیتی به روشهای مختلف عبارت است از:

Imports System
Imports System.Collections


Dim BA As New BitArray(5)


Dim myBA2 As New BitArray(5, False)


Dim myBytes() As Byte = {1, 2, 3, 4, 5}
Dim myBA3 As New BitArray(myBytes)


Dim myBools() As Boolean = {True, False, True, True, False}
Dim myBA4 As New BitArray(myBools)


Dim myInts() As Integer = {6, 7, 8, 9, 10}
Dim myBA5 As New BitArray(myInts)


نحوه خواندن اطلاعات تیز به صورت زیر است:


 MsgBox(myBA.Item(2))

Count و Length نیز تعداد و طول رشته بیتی را برمیگرداند

MsgBox(BA.Count)
MsgBox(BA.Length)


لینک کمکی به MSDN برای BitVector32

ساختاری از آرایه از 0 و 1 ها که 32 از حافظه را میگیرد


Imports System.Collections.Specialized


'ساخت یک BitVector با تمام خانه های False

Dim myBV As New BitVector32(0)


Dim myBit2 As Integer = BitVector32.CreateMask(myBit1)
Dim myBit3 As Integer = BitVector32.CreateMask(myBit2)
Dim myBit4 As Integer = BitVector32.CreateMask(myBit3)
Dim myBit5 As Integer = BitVector32.CreateMask(myBit4)


'نحوه نمایش آنها

MsgBox(myBV.ToString())

myBV(myBit1) = True
MsgBox(myBV.ToString())
myBV(myBit3) = True
MsgBox(myBV.ToString())
myBV(myBit5) = True
MsgBox(myBV.ToString())

متغیر صف Queue و پشته Stack

در Queue برای ریختن اطلاعات از Enqueue و برای گرفتن دریافت اطلاعات از Dequeue استفاده میشود. Peek نیز برای گرفتن اطلاعات بدون از بیرون کشیدن آن از صف است.
'Queue: First In First Out

Imports System.Collections

Dim q As New Queue()
q.Enqueue("Hello")
q.Enqueue("world")
q.Enqueue("just testing")
MsgBox("Queue demonstration:")
For i As Integer = 1 To 3
     ListBox1.Items.Add(q.Dequeue().ToString())
Next
خروجی در لیست باکس به ترتیب زیر خواهد بود:
Hello
world
just testing

در Stack برای ریختن اطلاعات از Push و برای گرفتن دریافت اطلاعات از Pop استفاده میشود. Peek نیز برای گرفتن اطلاعات بدون از بیرون کشیدن آن از پشته است.

'Stack: First In Last Out


Imports System.Collections
Dim s As New Stack()
s.Push("Hello")
s.Push("world")
s.Push("just testing")
MsgBox("Stack demonstration:")
For i As Integer = 1 To 3
ListBox1.Items.Add(s.Pop().ToString())
Next

خروجی در لیست باکس به ترتیب زیر خواهد بود:
just testing
world
Hello