![]() |
Модераторы: diadiavova, gambit |
![]() ![]() ![]() |
|
timich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 4.12.2008 Репутация: нет Всего: нет |
Подскажите пожалуйста, как нужно искать числа в массиве.
Допустим на этом примере.
Это сообщение отредактировал(а) timich - 5.3.2009, 13:13 |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 3 Всего: 59 |
Принцип тот же:
Подробнее тут: Array.Find Array.FindLast Array.FindIndex Array.FindLastIndex Array.FindAll -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Немного дополню ответ.
Помимо указанных функций есть ещё функция Contains, при чём есть такой метод пришедший из интерфейса System.Collections.Generic..::.ICollection<(Of <(T>)>) , что даёт возможность его использовать в начиная с 8 версии языка, но в последней версии появился такой же расширяющий метод System.Linq.Enumerable.Contains(Of TSource), который добавляется ко всем типам, реализующим интерфейс IEnumerable. Если надо проверять наличие сразу нескольких элементов, то целесообразно использовать собственный метод-расширитель
В данном примере я добавил к массиву метод ContainsAll, который проверяет наличие всех, переданных ему, аргументов и возвращает True, если они все присутствуют в массиве, если хоть какой-нибудь отсутствует, то метод возвратит False, что и рподемострированно примером. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 3 Всего: 59 |
diadiavova, очень хороший пример! (+1)
![]() -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
timich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 4.12.2008 Репутация: нет Всего: нет |
Даааа... Мне это надо неделю переваривать
![]() Спасибо! Попробую разобраться. Кстати, а на моем примере допишите нужные строки плиз. Это сообщение отредактировал(а) timich - 5.3.2009, 13:15 |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Просмотрел свой пример и нашёл пару слабых мест:
1. Если методу ContainsAll не передавать аргументы, то он возвратит True, хотя, по логике вещей должно быть наоборот. Решить проблему можно двумя способами, либо осуществлять проверку этого обстоятельства в коде, либо один аргумент сделать обязательным(этот мне нравится больше). 2.Если среди аргументов попался хотя бы один, отсутствующий в массиве, то дальнейший их перебор бессмысленен. Приведу исправленный вариант
Кроме того: есть смысл добавить его к ко всему, что реализует IEnumerable.
Естественно, при этом модуль, описанный выше должен существовать в проекте и если он размещён в другом пространстве имён, то это пространство должно быть импортировано в ту часть кода, где ты его хочешь использовать. Точне, модуль необязательно должен находиться в том же проекте, но пространство импортировать надо. Добавлено через 6 минут и 32 секунды Thx Это сообщение отредактировал(а) diadiavova - 5.3.2009, 14:03 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 3 Всего: 59 |
Лучше будет, если ты сам допишешь, так ты по крайней мере хоть немного привыкнешь. А по поводу то тебе дорога в МСДН, там все довольно доступно расписано про Extension методы. На самом деле это не сложнее, чем просто методы, которые ты уже знаешь... Вот здесь все подробно и на русском про Extension Добавлено через 3 минуты и 36 секунд Упс... опоздал... А я вот даже не стал проверять твой код, на слово поверил ![]() ![]() -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
timich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 4.12.2008 Репутация: нет Всего: нет |
Все работает классно! Спасибо!
Применил пример от diadiavova, но если честно, то конечно не абсолютно все понятно, но продолжаю изучать ![]() |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
А что конкретно не ясно, сам алгоритм или ещё что-то?
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
timich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 4.12.2008 Репутация: нет Всего: нет |
Не понятно , например что такое <Extension()> в принципе.
В мсдн объяснения для программистов, а не для новичков))) Потом, что такое Т и тоже в принципе. Ради интереса пробовал менять на другую букву, не знаю зачем но так просто))) Это тоже ByVal ParamArray elems() As T Вообще , не знаю плохо это или хорошо, не знакомый код несколько раз просматриваю в пошаговой работе, очень помогает. А в алгоритме вроде бы ясно все. |
|||
|
||||
diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Это новая фича в языке, позволяет дополнить любой тип своими методами. Если бы я не использовал её, то методом всё равно можно было бы пользоваться, толко так проще(не удивляйся) Вот как выглядит твой код учитывая, что я воспользовался этим атрибутом
Если бы я этого не сделал, то код следовало бы писать так
Собственно разница именно в этом. Когда метод помечается, как расширитель, то он как бы становится членом типа. На самом деле у класса Array нет метода ContainsAll, а мы его вызываем так, как будто он у него есть. Делается это благодаря тому, что мы расширили класс своим методом.
Тебе надо почитать этот топик. В общем и целом: универсальные типы удобны в тех случаях, когда заранее тип объекта неизвестен, а с ним надо работать. В данном случае нам известно, что мы работаем с массивом, но тип элементов массива может быть любым, и для того, чтобы как-то обращаться с этим неведомым типом мы его обозначаем буквой T. Обрати внимание, что тут нам надо было указать, что и массив и остальные параметры должны быть одного и того же типа, но не уточняется какого. ParamArray указывает, что метод может принимать неопределённое количество аргументов. Обрати внимание, что здесь было передано 3 аргумента, хотя указано только 2 параметра(arr не считается). Аргументов могло быть и больше, только возникает вопрос, как обработать их все в коде. Обычно к аргументам обращаются по именам, но когда их количество неопределено, то и имена всем дать невозможно. Поэтому принята такая модель, что последний параметр метода может быть помечен словом ParamArray. Это означает, что этому параметру можно передать любое количество аргументов указанного типа, но в теле функции к ним надо обращаться как к элементам массива. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||||
|
|||||||
timich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 4.12.2008 Репутация: нет Всего: нет |
Ну так намного легче
![]() Большое спасибо! |
|||
|
||||
![]() ![]() ![]() |
Правила форума VB .NET | |
|
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | VB .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |