Помогни ни да направим Uroci.net по - богат! Добави урок

Класът ArrayList Class

bubust   трудност:    видян: 5471



Нулиране (Clearing), копиране (Copying), и местене (Moving) на елементи

Може да нулирате порция от масив с метод Clear, без цикъл For:

` нулиране на елементи[10,100] на масива.

Array.Clear(arr, 10, 91)

Методът Array.Copy ви дава възможност да копирате елементите от едно-дименсионален масив в друг масив. Има две предефинирани (overloaded) версии на този метод. Първата версия копира даден брой елементи от масива източник в масива получател:

Dim intArr() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Dim intArr2(20) As Integer

`копиране на масива източник в първата половина на целевия масив.

Array.Copy(intArr, intArr2, 10)

Dim i As Integer

For i = 0 To 20

Console.Write(CStr(intArr2(i)) & " ")

' => 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0

Next

Втората версия ви оставя да решите кой е стартовия индекс за масива източник, и кой е стартовия индекс за масива получател (това е индексът на първият елемент, който ще се презапише), и броя на елементите за копиране:

`копиране на елементите с индекси 5-9 към края на масив destArr.

Array.Copy(intArr, 5, intArr2, 15, 5)

`това е първият елемент, който ще се копира.

Console.WriteLine(intArr2(15)) ' => 6

Вие получавате грешка от типа ArgumentOutOfRangeException ако подавате грешни стойности за индексите или ако масивът получател не е достатъчно дълъг, както получавате грешка от типа RankException ако всеки масив има две или повече размерности (дименсии).

Методът Copy работи коректно даже и ако масива източник и масива получател имат различни типове, но в такъв случай се налага да се провери индивидуално елемента източник спрямо кореспондиращия елемент в масива получател. Актуалното поведение зависи от много фактори, като например дали масива източник или масива получател са от стойностен тип или референтен тип. Примерно, вие можете да копирате от всеки масив в обектен масив (Object array), от целочислен масив (Integer) в масив Long, и от Single масив в масив Double, защото те са разширяващи конверсии и не могат да се сринат. Копирайте посредством изключение TypeMismatchException когато очаквате недостигаща конверсия между масиви от стойностен тип, дори и индивидуалните елементи на масива източник да са успешно конвертирани към стойностите на масива получател:

`тази операция Copy се извършва даже и ако типовете на масивите са различни.

Dim intArr3() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Dim lngArr3(20) As Long

Array.Copy(intArr3, lngArr3, 10)

`тази операция Copy пропада с TypeMismatchException.

Dim lngArr4() As Long = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Dim intArr4(20) As Integer

Array.Copy(lngArr4, intArr4, 10)

За сравнение, ако копирате от или във референтен тип масив, методът

Array.Copy опитва да копира всеки елемент; ако се получи грешка Invalid-

CastException за елемент, методът не копира този елемент нито стойността му след това.

Интересна черта на метода Array.Copy: способността за копиране на порция от масив върху себе си. В този случай, методът Copy извършва "smart copy," в смисъл че елементите се копират коректно във възходящ ред, ако копирате към ниския индекс, или в обратен ред, ако копирате към високия индекс. Така можете да използвате метода Copy за да изтриете един или повече елемента и да запълните дупката в масива, което като резултат е преместване на всички следващи елементи на една или повече позиции спрямо ниския индекс:

Dim lngArr5() As Long = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

`изтрива елемент с индекс 4.

Array.Copy(lngArr5, 5, lngArr5, 4, 5)

` комплектова операцията по изтриванет с нулиране на последния елемент.

Array.Clear(lngArr5, lngArr5.GetUpperBound(0), 1)

`сега масивът съдържа: {1, 2, 3, 4, 6, 7, 8, 9, 10, 0}

Reading 4 Arrays, Lists, and Collections 83

Можете да използвате този код за база на преизползваема подпрограма, която работи с всеки тип масив:

Sub ArrayDeleteElement(ByVal arr As Array, ByVal index As Integer)

' премества елементите от arr(index+1) във arr(index).

Array.Copy(arr, index + 1, arr, index, UBound(arr) - Index)

' нулиране на последния елемент.

arr.Clear(arr, arr.GetUpperBound(0), 1)

End Sub

Вмъкването на елемент е също лесно, и отново може да създадете родова подпрограма за работа с масиви от всеки тип:

Sub ArrayInsertElement(ByVal arr As Array, ByVal index As Integer, _

Optional ByVal newValue As Object = Nothing)

' премества елементите от arr(index) във arr(index+1)за да се освободи място.

Array.Copy(arr, index, arr, index + 1, arr.Length - index - 1)

' присвоява елемент използвайки метод SetValue.

arr.SetValue(newValue, index)

End Sub

Класът Array class представя методите SetValue и GetValue за присвояване и четене на елементи; нормално няма да ги ползвате в обикновените програми, но те са полезни в родови подпрограми (като двете предишни подпрограми) които работят с всеки тип масив. SetValue и GetValue са също полезни за работа с елементи от масиви несъвместими с CLS (non-CLS-compliant arrays) с ненулев нисък индекс.

Можете да използвате Copy с мулти-дименсионални масиви, като в този случай масивите се третират като едно-дименсионални с всички редове поставени един след друг в паметта.



Търсене на стойности (Searching Values)

Методът IndexOf търси в масива за стойност и връща индекса на първия елемент, който съответствува или -1 ако няма съответствие:

Dim strArray() As String = {"Robert", "Pavel", "Ana", "Chris", "Pavel"}

Console.WriteLine(Array.IndexOf(strArray, "Ana")) ' => 2

Console.WriteLine(Array.IndexOf(strArray, "ANA")) ' => -1

По-прецизно, IndexOf връща стойността на най-ниския индекс минус 1

ако няма съответствие; тази разлика е важна ако масива не е 0-базиран. Можете да специфицирате стартовия индекс и опционално крайния индекс; ако крайния индекс се пропусни, търсенето продължава до края на масива.

Може да използвате тази предефинирана (overloaded) форма, за да намерите всички стойности в масива като зададената:

`търсене на всички съвпадения на стринг "Pavel".

Dim index As Integer = -1

Do

'търсене на следващо попадение.

index = Array.IndexOf(strArray, "Pavel", index + 1)

' ако не е намерено Exit на цикъла.

If index = -1 Then Exit Do

Console.WriteLine("Found at index {0}", index)

Loop

Предшестващият цикъл показва следното съобщение в конзолния прозорец:

Found at index 1

Found at index 4

Методът LastIndexOf е подобен на IndexOf с изключение че връща индекса на последната съвпаднала стойност.

Понеже търсенето е отзад напред, трябва крайния подаден индекс да е по-голям от първия подаден:

`търсене от най-високия индекс към началото на масива.

index = strArr.Length

Do

index = Array.LastIndexOf(strArr, "Pavel", index - 1)

If index = -1 Then Exit Do

Console.WriteLine("Found at index {0}", index)

Loop

Методите IndexOf и LastIndexOf провеждат линейно търсене, което е бавно при огромни масиви. Много по-бърз код ако масивът е сортиран е двоичното търсене, т.е. използването но метод BinarySearch:

` (Binary) двоично търсене на сортиран масив

Dim strArr2() As String = {"Ana", "Chris", "Pavel", "Robert", "Sam"}

Console.WriteLine(Array.BinarySearch(strArr2, "Chris")) ' => 1

Ако не се намери елемента, методът връща отрицателна стойност, който е побитов обратен код на индекса на първия елемент, който е по-голям от търсената стойност. Това помага да се определи къде да се вмъкне стойност в сортиран масив:

index = Array.BinarySearch(strArr2, "David")

If index >= 0 Then

Console.WriteLine("Found at index {0}", index)

Else

' инвертиране на резултата за да се даде индекса преди точката на вмъкване.

index = Not index

Console.WriteLine("Not Found. Insert at index {0}", index)

' => Not found. Insert at index 2

End If

Можете да подадете стартов индекс и дължината на порцията от масива от точката в която искате да започнете търсенето, което е полезно, когато работите с масив, който е частично запълнен само:

Console.Write(Array.BinarySearch(strArr2, 0, 3, "Chris"))'=> 1

Накрая, и двете синтактични форми на метод BinarySearch поддържат обект IComparer в края на списъка на аргументите, което ви дава възможност да определите как се сравняват елементите. На практика можете да използвате същия обект IComparer, който подавате на метод Sort, за да сортирате масива.


Класът ArrayList class

Класът ArrayList представя методи, които позволяват да се манипулират области (ranges) от елементи в една операция. Методът AddRange добавя към текущия обект ArrayList всички елементи съдържащи се в друг обект, който изпълнява интерфейса ICollection. Много класове .NET изпълняват ICollection, като колекция на всички членове (items) в контрола списъчна кутия (List-Box) и колекцията от възли в контрол Йерархичен изглед (TreeView). Следващата подпрограма взема два обекта ArrayList и връща трети ArrayList който съдържа всички членове на двата аргумента:

Function ArrayListJoin(ByVal al1 As ArrayList, ByVal al2 As ArrayList) _

As ArrayList

ArrayListJoin = New ArrayList(al1.Count + al2.count)

ArrayListJoin.AddRange(al1)

ArrayListJoin.AddRange(al2)

End Function

Методът InsertRange работи по подобен начин, но ви оставя да вмъкнете много елементи до всеки индекс в текущия обект ArrayList:

`вмъква всички елементи от al2 в началото на текущия ArrayList.

al.InsertRange(0, al2)

RemoveRange изтрива много елементи в текущия обект ArrayList :

` изтрива последните четири елемента

al.RemoveRange(al.Count - 4, 4)

можете бързо да извлечете всички членове в обект ArrayList чрез използване на метод ToArray или CopyTo метод. Двата метода поддържат едно-дименсионален (one-dimensional) целеви масив от всеки тип, но последният позволява да се извлече подмножество от ArrayList:

Dim objArr() As Object = al.ToArray()

Dim strArr() As String = CType(al.ToArray(GetType(String)), String())

Dim strArr2(al.Count) As String

al.CopyTo(strArr2)

Dim strArr3() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}

al.CopyTo(0, strArr3, 4, 2)

Класът ArrayList поддържа други полезни методи, като Sort, SortRange,

BinarySearch, IndexOf, LastIndexOf, и Reverse.

Последната характеристика на класа ArrayList е неговия споделен метод Adapter. Този метод взема IList-произхождащия обект като негов единствен аргумент и създава ArrayList обвивка около този обект. С други думи вместо да създава копие на аргумента, метод Adapter създава обект ArrayList, който "съдържа" оригиналната колекция: всички промени които правите на външния ArrayList обект се дублират и във вътрешната колекция.

Следният код демонстрира как да използваме тази техника да реверсираме (или сортираме и т.н.) всички членове в контрол ListBox:

`създава обвивка около Listbox.Items IList колекцията.

Dim lbAdapter As ArrayList = ArrayList.Adapter(ListBox1.Items)

` реверсира реда им.

lbAdapter.Reverse()

Ако не мислите да използвате ArrayList, можете да направите кода по-кратък:

ArrayList.Adapter(ListBox1.Items).Reverse


Страници: «1 2

Регистрирайте се, за да добавите коментар


Калдейта ЕООД - © 2003-2010. Всички права запазени.
Препоръчваме: Национален Бизнес | Bomba.bg | IT Новини | Диплома.бг | TRAVEL туризъм | Реферати | AmAm.bg | Иде.ли | Курсови работи | Фото Форум | Spodeli.net | Фото-Култ | Atol.bg | Elmaz.com | MobileBulgaria.com | Казанлък.Com