|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Icollection
Інтерфейс
Icollection визначається похідним від Ienumerable; він доповнює цей інтерфейс
трьома властивостями, доступними тільки для читання, і одним новим методом. Клас
Icollection рідко реалізується самостійно. Як правило, він утворює базу
для інтерфейсів Ilist і Idictionary (див. нижчий). Члени цього інтерфейсу перераховані
в таблиці. 5.2. Таблиця
5.2.
Члени інтерфейсу Icollection
Інтерфейс
Ilist забезпечує вибірку елементів колекції по індексу. Зрозуміло, оскільки
цей інтерфейс визначається похідним від I Enumerable, при цьому зберігається
можливість використання For-each. Ієрархія спадкоємства Ilist виглядає таким
чином: Ienumerable->icollection->ilist Інтерфейс
Ilist відносно складний — він складається з трьох властивостей і семи методів (таблиця.
5.3). Нагадаємо, що деякі з методів можуть бути порожніми, якщо в якомусь
конкретному класі їх реалізація не має сенсу. Таблиця
5.3.
Члени інтерфейсу Ilist
Інтерфейс
Idictionary представляє колекцію, в якій доступ до даних здійснюється
по ключу, — як в хэш-таблицах, описаних в попередньому розділі. Більш того, клас
хэш-таблиц в числі інших реалізує інтерфейси Idictionary, Icollection, Enumerable
і Icloneable!
Хоча інтерфейс Idictionary оголошується похідним від Enumerable і переходу до
наступного елементу може здійснюватися методом Movenext, зазвичай така можливість
не використовується — колекції, реалізовуючі Idictionary, орієнтуються насамперед на звернення
по ключу, а не на послідовний перебір елементів. З цієї причини інтерфейс
Idictionary залежить від інтерфейсу Idic-tionaryenumerator, який розширює
Enumerator і доповнює його трьома новими властивостями:
Члени класу
Idictionary перераховані в таблиці. 5.4. Таблиця
5.4.
Члени інтерфейсу Idictionary
Припустимо, колекцію
об'єктів Employee потрібно було відсортувати по заробітній платі.
Звичайно, операцію сортування було б зручно реалізувати безпосередньо в класі
Emplоуєе, щоб сортування простого або динамічного масиву об'єктів цього
класу виконувалося так само просто, як сортування строкових масивів. Виявляється,
порядок сортування елементів, використовуваний методом Sort класів Array і Arraylist,
визначається інтерфейсом Icomparable (строкові масиви інтерфейс Icomparabl
e сортує в порядку ASCII-кодов). Інтерфейс складається з єдиного методу
Compareto: Function Compareto(Byvalobj As Object) As Integer Метод повертає
наступні значення:
Наступна
версія класу Employee реалізує інтерфейси lenumerable і Icomparable і сортує
масив по убуванню заробітної плати: Public
Class Employee Implements Icomparable Private
m_name As String Private
m_salary As Decimal Private Const
LIMIT As Decimal =0.10 Public Sub New(Byval thename As String,byval cursalary As Decimal) m_name =
thename m_salary = cursalary End
Sub Public Function
Compareto(Byval anemployee As Object) As Integer _ Implements Icomparable.CompareTo If Ctype(anemployee,employee).Salany
< Me.Salary Then Return -1 El self Ctypetanemployee.Employee).Salary
= Me.Salary Then Return 0 Elself Ctypecanemployee,employee).Salary
> Me.Salary Then Return 1 End
If End
Function Public Readonly
Property Thename() As String Get Return
m_name End Get End Property Public Readonly
Property Salary() As Decimal Get Return Myclass.m_Salary End Get
End Property Public Overridable Overloads Sub Raisesalary(Byval Percent As Decimal) If Percent >
LIMIT Then ' Операція заборонена - необхідний пароль Console.WriteLine("NEED PASSWORD TO RAISE SALARY MORE " & _ "THAN LIMIT!!!!") Else m_salary =(1
+ Percent) * m_salary End If End Sub Public Overridable
Overloads Sub Raisesalary(Byval Percent As Decimal._ Byval Password
As String) If Password = "special" Then m_salary =(1 + Percent) * m_salary End If End Sub End
Class Для тестування
нової версії класу можна скористатися наступною програмою: Sub Main() Dim torn As New Employee("Tom". 50000) Dim sally'as New Employee("Sally", 60000) Dim joe As New Employee("Joe", 20000) Dim gary As New Employєє("Gary", 1) Dim theemployees()
As Employee = _ {torn, sally,
joe. gary} Array.Sort(theemployees) ' Порядок сортування визначається Compareto! Dim aemployee As Employee For Each
aemployee In theemployees Console.WriteLine(aemployee.TheName
& "has yearly salary $" & Formatnumbertaemployee.Salary))
Next Console.ReadLine() End Sub Результат
показаний на мал. 5.9.
Мал.
5.9. Сортування по
нестандартному критерію з використанням Icomparable
.NET Framework дозволяє виконувати сортування по декількох критеріях. Наприклад, щоб упорядкувати масив працівників спочатку по заробітній платі, а потім по імені (у групах з однаковою зарплатою) слід реалізувати інтерфейс Icomparer, що містить єдиний метод Сотрагето. При цьому ви зможете скористатися одній з переобтяжених версій Array. Sort (або Arraylist. Sort), яка має наступну сигнатуру: Public
Shared Sub Sort(Byval array As Array. Byval comparer As Icomparer) Зазвичай в
програмі створюється окремий клас, реалізовуючий Icomparer, і екземпляр цього
класу передається методу Sort. Приклад такого класу приведений нижче. Звернете
увагу на виділений рядок — в ній імена працівників передаються у вигляді рядків
методу Compare класу String: Public
Class Sortbyname Implements Icomparer Public Function
Compareto(Byval firstemp As Object.ByVal secondemp=as Object) As Integer Implements Icomparer.Compare Dim temp1 As Employee = Ctype(firstemp,employee) Dim temp2 As Employee = Ctype(secondemp.Employee) Return String.Compare(templ.TheName. temp2.TheName) End Function End Class Приклад процедури
Sub Main з використанням цього класу: Submain() Dim torn As
New Employee("Tom", 50000) Dim sally As
New Employee("Sally". 60000) Dim sam As New
Employee("Sam". 60000) Dim ted As New
Employee("Ted". 50000) Dim theemployees() As Employee = _ {torn.sally,sam.ted} Array.Sort(theemployees) Dim Sortingbyname
As Sortbyname = New Sortbyname() Array.Sort(theemployees,sortingbyname) Dim
aemployee As Employee For Each
aemployee In theemployees Console.WriteLine(aemployee.TheName & "has yearly salary $" & Formatnumbercaemployee.Salary)) Next Console. Readline()
End Sub . Результат
показаний на мал. 5.10
Мал.
5.10. Сортування по
декількох критеріях з використанням Icomparer
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||