Реализация ICollection(Of T)

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Реализация ICollection(Of T)

Сообщение MIT » 25.02.2009 (Ср) 11:56

Был, значит, у меня класс - подобие коллекции, с Add (AddRange), Set/Get, Remove, Clear и т.д.. Но вот проблема - For Each работать с таким классом не будет. Решил переделать на "коллекционный" интерфейс; со многими функциями все понятно, но, вот, не знаю как реализовать следующее:
1) Public Function Remove(ByVal item As T) As Boolean - как удалить элемент в таком случае, если объект, например, картика?
2) Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) - вообще без понятия как енумераторы создавать
3) Public Function GetEnumerator1() As System.Collections.IEnumerator - то же самое
4) Public ReadOnly Property IsReadOnly() As Boolean - не понял в чем смысл
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Реализация ICollection(Of T)

Сообщение ANDLL » 25.02.2009 (Ср) 12:03

Вообще что бы с твоей коллекцией работал Foreach нужно реализовать IEnumerable(T) (ICollection от него наследуется)
Поэтому на самом деле тебе нужно реализовать только 2 и 3.
Енумератор - класс который реализует IEnumerator, посмотри его методы и поймешь.
4) MSDN?
1) Как обычно, в чем проблема?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Реализация ICollection(Of T)

Сообщение MIT » 25.02.2009 (Ср) 12:43

ANDLL писал(а):1) Как обычно, в чем проблема?
Может я не совсем понимаю, но реализация такой функции должна подразумевать что-то типа поиска по внутреннему хранилищу, сравнивания объекта с item`ом, и при совпадении удаления его из хранилища. Так? Так, вот, если работаем со строками, то тут все более-менее просто, а как сравнивать картинки, потоки, например, классы или сложные структуры?

ANDLL писал(а):Енумератор - класс который реализует IEnumerator, посмотри его методы и поймешь.
Ну, более-менее "попонятнело" :) . Значит создаем класс (с Implements IEnumerator(Of T)), передаем ему все данные (например массив структур), содержащиеся в IEnumerable-классе, а дальше просто реализуем возможность перебора по элементам?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Реализация ICollection(Of T)

Сообщение ANDLL » 25.02.2009 (Ср) 12:47

Значит создаем класс (с Implements IEnumerator(Of T)), передаем ему все данные (например массив структур), содержащиеся в IEnumerable-классе, а дальше просто реализуем возможность перебора по элементам?
Ога
Так, вот, если работаем со строками, то тут все более-менее просто, а как сравнивать картинки, потоки, например, классы или сложные структуры?
Методом equals или с помощью Is в зависимости от постановки задачи
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Реализация ICollection(Of T)

Сообщение MIT » 25.02.2009 (Ср) 13:04

ANDLL Спасибо! :cyclops:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Реализация ICollection(Of T)

Сообщение Joo » 25.02.2009 (Ср) 13:11

MIT
Извини конечно, но мне кажется ты совсем обленился, и не хочешь искать сам, это же все есть в MSDN!
Код: Выделить всё
Public Class PeopleEnum
    Implements IEnumerator

    Public _people() As Person

    ' Enumerators are positioned before the first element
    ' until the first MoveNext() call.
    Dim position As Integer = -1

    Public Sub New(ByVal list() As Person)
        _people = list
    End Sub

    Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
        position = position + 1
        Return (position < _people.Length)
    End Function

    Public Sub Reset() Implements IEnumerator.Reset
        position = -1
    End Sub

    Public ReadOnly Property Current() As Object Implements IEnumerator.Current
        Get
            Try
                Return _people(position)
            Catch ex As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
End Class


Заметки
Интерфейс IEnumerator<(Of <(T>)>) является базовым интерфейсом для всех универсальных перечислителей.

Оператор foreach языка C# (for each в C++, For Each в Visual Basic) позволяет скрыть сложный механизм перечисления. Поэтому рекомендуется вместо непосредственного использования перечислителя применять ключевое слово foreach.

Перечислители могут использоваться для чтения данных коллекции; они не могут использоваться для изменения коллекции.

Изначально перечислитель располагается перед первым элементом коллекции. В этой позиции значение свойства Current не определено. Поэтому необходимо вызвать метод MoveNext до считывания значения свойства Current, чтобы переместить перечислитель к первому элементу коллекции.

Свойство Current возвращает тот же объект, пока не будет вызван метод MoveNext. Метод MoveNext задает свойство Current следующему элементу.

Если метод MoveNext достигает конца коллекции, перечислитель располагается после последнего элемента коллекции, а MoveNext возвращает значение false. Когда перечислитель находится в этой позиции, последующие вызовы метода MoveNext также возвращают значение false. Если при последнем вызове метода MoveNext было возвращено значение false, значение свойства Current не определено. Значение свойства Current не может быть повторно задано первому элементу коллекции; вместо этого следует создать новый экземпляр перечислителя.

Метод Reset предназначен для COM-взаимодействия. Нет необходимости осуществлять реализацию; можно просто использовать выдачу исключения NotSupportedException.

Перечислитель остается допустимым, пока в коллекцию не вносятся изменения. Если в коллекцию вносятся изменения, такие как добавление, изменение или удаление элементов, перечислитель становится необратимо недопустимым, а его поведение — неопределенным.

Перечислитель не имеет монопольного доступа к коллекции, поэтому перечисление для коллекции в действительности не является потокобезопасной процедурой. Чтобы гарантировать потокобезопасность при перечислении, можно заблокировать коллекцию на все время выполнения процедуры перечисления. Чтобы разрешить доступ к коллекции из нескольких потоков для чтения и записи, необходимо реализовать собственную синхронизацию.

Используемые по умолчанию реализации коллекций в пространстве имен System.Collections.Generic не синхронизированы.

Примечания для реализующих объектов:

Реализация этого интерфейса требует реализации неуниверсального интерфейса IEnumerator. Методы MoveNext и Reset не зависят от параметра T и появляются только в неуниверсальном интерфейсе. Свойство Current появляется в обоих интерфейсах и имеет различные типы возврата. Реализация неуниверсального свойства IEnumerator..::.Current в качестве явной реализации интерфейса. Это позволяет любому потребителю неуниверсального интерфейса использовать и универсальный интерфейс.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Реализация ICollection(Of T)

Сообщение MIT » 25.02.2009 (Ср) 13:43

Scarabey писал(а):Извини конечно, но мне кажется ты совсем обленился, и не хочешь искать сам, это же все есть в MSDN!
:mrgreen:
НО!
Во-первых: изначально вопрос (с моей стороны) вообще не касался IEnumerator
Во-вторых: после разъяснения того, что реализовывать надо именно его, я сам предложил вариант, а не попросил примерчик. По поводу его реализации мне все понятно, я просто уточнил, мало ли что.
В-третьих: у меня сейчас нет русского MSDN. Хоть я и могу прочитать (и понять) английкий материал, мне приятней прибегнуть к помощи рускоговорящих живых людей, у которых можно что-то уточнить.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Реализация ICollection(Of T)

Сообщение Joo » 25.02.2009 (Ср) 13:59

MIT писал(а):
Scarabey писал(а):Извини конечно, но мне кажется ты совсем обленился, и не хочешь искать сам, это же все есть в MSDN!
:mrgreen:
НО!
Во-первых: изначально вопрос (с моей стороны) вообще не касался IEnumerator
Во-вторых: после разъяснения того, что реализовывать надо именно его, я сам предложил вариант, а не попросил примерчик. По поводу его реализации мне все понятно, я просто уточнил, мало ли что.
В-третьих: у меня сейчас нет русского MSDN. Хоть я и могу прочитать (и понять) английкий материал, мне приятней прибегнуть к помощи рускоговорящих живых людей, у которых можно что-то уточнить.


Во-первых: Аналогично в MSDN есть пример и для ICollection(Of T), так что не нужно сейчас оправдываться.
Во-вторых: Английски вообще не должен быть проблемой, так что тут об этом вообще упоминать стыдно.
В-третьих: Есть много задачь не описаных в MSDN, у тебя таких задачь довольно много и они очень интересны в плане обсуждения, но задавать вопрос, ответ на который легко ищется в MSDN... Извините, это набивание постов, попросту флуд.
Вот тебе и НО! :wink:

з.ы. Ты сам иногда отвечаешь "Юзайте поиск"...
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Реализация ICollection(Of T)

Сообщение MIT » 25.02.2009 (Ср) 14:16

Scarabey писал(а):не нужно сейчас оправдываться
Я никогда и не перед кем не оправдываюсь, и сейчас не исключение. :|
Scarabey писал(а):Английски вообще не должен быть проблемой, так что тут об этом вообще упоминать стыдно.
Я не говорил, что английский - проблема. Просто для меня, как для человека общественного, приятней это обсудить.
Scarabey писал(а):Извините, это набивание постов, попросту флуд.
То же самое можно сказать и тебе, ведь решение удачно решенной проблемы не вполне корректно.

Не будем переходить на личности и оскорблять друг друга. Все. Вопрос решен, тема исчерпана. 2Scarabey: если тебя что-то все же не устраивает - можем перенести палемику в ICQ, а так это и правда пустой флуд.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Реализация ICollection(Of T)

Сообщение Joo » 25.02.2009 (Ср) 14:24

MIT писал(а):Не будем переходить на личности и оскорблять друг друга. Все. Вопрос решен, тема исчерпана. 2Scarabey: если тебя что-то все же не устраивает - можем перенести палемику в ICQ, а так это и правда пустой флуд.

Ладно действительно, я виноват извиняюсь.... В отпуск наверное пора уже...
В общем MIT :cyclops: не принимай на свой счет, действительно все таки лучше обсудить на форуме, мало ли вдруг еще кто столкнется с такой проблемой, и не будет знать в какую сторону копать.
Можете удалить мои посты как флуд 8)
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 99

    TopList