Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в массиве, как организовать поиск 
V
    Опции темы
timich
Дата 5.3.2009, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Подскажите пожалуйста, как нужно искать числа в массиве.

Допустим на этом примере.

Код

 Dim массив(7) As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        массив(1) = 10
        массив(2) = 5
        массив(3) = 1
        массив(4) = 6
        массив(5) = 124
        массив(6) = 77
        массив(7) = 31

        'если в массиве есть например числа 77, 124, 5 то 

        Debug.WriteLine("есть")

    End Sub


Это сообщение отредактировал(а) timich - 5.3.2009, 13:13
PM MAIL   Вверх
-Mikle-
Дата 5.3.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Принцип тот же:

Код

        Dim expr, find As Integer
        expr = 124
        ' одна из следующих строк, в зависимости что тебе нужно получить
        find = Array.Find(arr, Function(val As Integer) val = expr)
        find = Array.FindIndex(arr, Function(val As Integer) val = expr)
        find = Array.FindLast(arr, Function(val As Integer) val = expr)
        find = Array.FindLastIndex(arr, Function(val As Integer) val = expr)
        ' а эта строчка вернет в массиве все найденные элементы
        Dim result() As Integer = Array.FindAll(arr, Function(val As Integer) val = expr)


Подробнее тут:
Array.Find
Array.FindLast
Array.FindIndex
Array.FindLastIndex
Array.FindAll




--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
diadiavova
Дата 5.3.2009, 12:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Немного дополню ответ.
Помимо указанных функций есть ещё функция Contains, при чём есть такой метод пришедший из интерфейса System.Collections.Generic..::.ICollection<(Of <(T>)>) , что даёт возможность его использовать в начиная с 8 версии языка, но в последней версии появился такой же расширяющий метод System.Linq.Enumerable.Contains(Of TSource), который добавляется ко всем типам, реализующим интерфейс IEnumerable.
Если надо проверять наличие сразу нескольких элементов, то целесообразно использовать собственный метод-расширитель
Код

Imports System.Runtime.CompilerServices
Module Module1
    Sub Main()
        Dim arr() As Integer = {1, 23, 3, 2}
        Console.WriteLine(arr.ContainsAll(1, 2, 3))
        Console.WriteLine(arr.ContainsAll(1, 2, 5))
        Console.ReadLine()
    End Sub
End Module
Module Ext
    <Extension()> _
    Function ContainsAll(Of T)(ByVal arr() As T, ByVal ParamArray elems() As T) As Boolean
        Dim rv As Boolean = True
        For Each el As T In elems
            rv = rv And arr.Contains(el)
        Next
        Return rv
    End Function
End Module


В данном примере я добавил к массиву метод ContainsAll, который проверяет наличие всех, переданных ему, аргументов и возвращает True, если они все присутствуют в массиве, если хоть какой-нибудь отсутствует, то метод возвратит False, что и рподемострированно примером.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
-Mikle-
Дата 5.3.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



diadiavova, очень хороший пример! (+1)  smile 


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
timich
Дата 5.3.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Даааа... Мне это надо неделю переваривать smile 
Спасибо! Попробую разобраться.
Кстати, а на моем примере допишите нужные строки плиз.

Это сообщение отредактировал(а) timich - 5.3.2009, 13:15
PM MAIL   Вверх
diadiavova
Дата 5.3.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Просмотрел свой пример и нашёл пару слабых мест:
1. Если методу ContainsAll не передавать аргументы, то он возвратит True, хотя, по логике вещей должно быть наоборот.
Решить проблему можно двумя способами, либо осуществлять проверку этого обстоятельства в коде, либо один аргумент сделать обязательным(этот мне нравится больше).
2.Если среди аргументов попался хотя бы один, отсутствующий в массиве, то дальнейший их перебор бессмысленен.
Приведу исправленный вариант
Код

Imports System.Runtime.CompilerServices
Module Ext
    <Extension()> _
    Function ContainsAll(Of T)(ByVal arr() As T, ByVal first As T, ByVal ParamArray elems() As T) As Boolean
        If arr.Contains(first) Then
            For Each el As T In elems
                If Not arr.Contains(el) Then
                    Return False
                End If
            Next
        Else
            Return False
        End If
        Return True
    End Function
End Module


Кроме того: есть смысл добавить его к ко всему, что реализует IEnumerable.

Цитата(timich @  5.3.2009,  13:12 Найти цитируемый пост)
Кстати, а на моем примере допишите нужные строки плиз.


Код

 Dim массив(7) As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        массив(1) = 10
        массив(2) = 5
        массив(3) = 1
        массив(4) = 6
        массив(5) = 124
        массив(6) = 77
        массив(7) = 31
        If массив.ContainsAll( 77, 124, 5 ) Then
            Debug.WriteLine("есть")
        End If
    End Sub


Естественно, при этом модуль, описанный выше должен существовать в проекте и если он размещён в другом пространстве имён, то это пространство должно быть импортировано в ту часть кода, где ты его хочешь использовать. Точне, модуль необязательно должен находиться в том же проекте, но пространство импортировать надо.

Добавлено через 6 минут и 32 секунды
Цитата(-Mikle- @  5.3.2009,  13:00 Найти цитируемый пост)
diadiavova, очень хороший пример! (+1)  smile  

Thx

Это сообщение отредактировал(а) diadiavova - 5.3.2009, 14:03


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
-Mikle-
Дата 5.3.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Цитата(timich @  5.3.2009,  16:12 Найти цитируемый пост)
Кстати, а на моем примере допишите нужные строки плиз

Лучше будет, если ты сам допишешь, так ты по крайней мере хоть немного привыкнешь.

А по поводу
Цитата(timich @  5.3.2009,  16:12 Найти цитируемый пост)
Мне это надо неделю переваривать 

то тебе дорога в МСДН, там все довольно доступно расписано про Extension методы. На самом деле это не сложнее, чем просто методы, которые ты уже знаешь...

Вот здесь все подробно и на русском про Extension

Добавлено через 3 минуты и 36 секунд
Упс... опоздал...

Цитата(diadiavova @  5.3.2009,  17:02 Найти цитируемый пост)
Просмотрел свой пример и нашёл пару слабых мест

А я вот даже не стал проверять твой код, на слово поверил  smile ....  эх ты.....  smile 


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
diadiavova
Дата 5.3.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(-Mikle- @  5.3.2009,  14:13 Найти цитируемый пост)
эх ты

Ну я же исправился smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
timich
Дата 7.3.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Все работает классно! Спасибо!
Применил пример от diadiavova, но если честно, то конечно не абсолютно все понятно, но продолжаю изучать smile 
PM MAIL   Вверх
diadiavova
Дата 7.3.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



А что конкретно не ясно, сам алгоритм или ещё что-то?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
timich
Дата 7.3.2009, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Не понятно , например  что такое <Extension()> в принципе.

В мсдн объяснения для программистов, а не для новичков)))

Потом, что такое Т и тоже в принципе. Ради интереса пробовал менять на другую букву, не знаю зачем но так просто)))

Это тоже  ByVal ParamArray elems() As T

Вообще , не знаю плохо это или хорошо, не знакомый код несколько раз просматриваю в пошаговой работе, очень помогает.

А в алгоритме вроде бы ясно все.
PM MAIL   Вверх
diadiavova
Дата 7.3.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(timich @  7.3.2009,  00:56 Найти цитируемый пост)
Не понятно , например  что такое <Extension()> в принципе.

Это новая фича в языке, позволяет дополнить любой тип своими методами. Если бы я не использовал её, то методом всё равно можно было бы пользоваться, толко так проще(не удивляйся)

Вот как выглядит твой код учитывая, что я воспользовался этим атрибутом
Код

        If массив.ContainsAll( 77, 124, 5 ) Then
            Debug.WriteLine("есть")
        End If


Если бы я этого не сделал, то код следовало бы писать так
Код

        If ContainsAll(массив, 77, 124, 5 ) Then
            Debug.WriteLine("есть")
        End If


Собственно разница именно в этом. Когда метод помечается, как расширитель, то он как бы становится членом типа. На самом деле у класса Array нет метода ContainsAll, а мы его вызываем так, как будто он у него есть. Делается это благодаря тому, что мы расширили класс своим методом.


Цитата(timich @  7.3.2009,  00:56 Найти цитируемый пост)
Потом, что такое Т и тоже в принципе. Ради интереса пробовал менять на другую букву, не знаю зачем но так просто)))

Тебе надо почитать этот топик
В общем и целом: универсальные типы удобны в тех случаях, когда заранее тип объекта неизвестен, а с ним надо работать. 
В данном случае нам известно, что мы работаем с массивом, но тип элементов массива может быть любым, и для того, чтобы как-то обращаться с этим неведомым типом мы его обозначаем буквой T. Обрати внимание, что тут нам надо было указать, что и массив и остальные параметры должны быть одного и того же типа, но не уточняется какого.




Цитата(timich @  7.3.2009,  00:56 Найти цитируемый пост)
Это тоже  ByVal ParamArray elems() As T


ParamArray указывает, что метод может принимать неопределённое количество аргументов. Обрати внимание, что здесь было передано 3 аргумента, хотя указано только 2 параметра(arr не считается). Аргументов могло быть и больше, только возникает вопрос, как обработать их все в коде. Обычно к аргументам обращаются по именам, но когда их количество неопределено, то и имена всем дать невозможно. Поэтому принята такая модель, что последний параметр метода может быть помечен словом ParamArray. Это означает, что этому параметру можно передать любое количество аргументов указанного типа, но в теле функции к ним надо обращаться как к элементам массива.




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
timich
Дата 7.3.2009, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Ну так намного легче  smile 
Большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.