powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Есть ли число в списке чисел (то же что IN(...), только в коде)
8 сообщений из 33, страница 2 из 2
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548144
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
Здравствуйте, Сергей! Что-то я тоже засомневался, насколько ваш тестовый стенд корректен. Добавил свою идею (по аналогии), и вот что получилось :)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Option Compare Database

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TestComp()
Dim idsList As New Collection
Dim startTime, diffTime As Long
Dim i As Long
Dim result As String
Dim blnComp As Boolean
Dim counter As Long
Dim testArr

    counter = 9999
    
    For i = 0 To counter
        idsList.Add i, CStr(i)
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = idsList(CStr(i)) = i
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование коллекции.                       Считываний: " & counter + 1 & " раз. Время: " & diffTime
    
 '=====================================
    
    ReDim testArr(counter + 1)
    For i = 0 To counter
        testArr(i) = i
    Next i
    
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = testArr(i) - i = 0
    Next i
    diffTime = GetTickCount - startTime
    Debug.Print "Использование проверки разности на равенство нулю.                   Считываний: " & counter + 1 & " раз. Время: " & diffTime    '=====================================
 End Sub

TestComp
Использование коллекции.                       Считываний: 10000 раз. Время: 31
Использование проверки разности на равенство нулю.                   Считываний: 10000 раз. Время: 0
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548220
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport,
Добрый вечер :)

Код: vbnet
1.
2.
3.
4.
5.
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = testArr(i) - i = 0
    Next i
    diffTime = GetTickCount - startTime


не, это же просто считывание n-ого элемента массива. А поиск где? :)

вот здесь вот:
Код: vbnet
1.
2.
3.
4.
5.
    startTime = GetTickCount
    For i = 0 To counter
        blnComp = InArr(i, testArr)
    Next i
    diffTime = GetTickCount - startTime


было 10000 операций поиска. 10000 раз выполнялась функция InArr. А внутри каждого вызова функции, в зависимости от положения элемента в массиве выполнялось от 1 до 10000 переборов.
Т.е. у вас на порядки меньше циклов. И самое главное, где поиск? Ведь как бы предполагается, что на вход идет нечто(строка, массив, коллекция) и нужно узнать, содержит ли это "нечно" нужный элемент.

Если вы смотрите вот сюда:
Код: vbnet
1.
2.
3.
    For i = 0 To counter
        blnComp = idsList(CStr(i)) = i
    Next i


и думаете, что это я так же как и вы просто обращаюсь к элементу коллекции по номеру, то это не так. Я тут обращаюсь не по номеру, а по ключу. Если бы я обращался по номеру, то это бы выглядело так: idsList(i). А у меня вот так: idsList(CStr(i))

Выше в обсуждении я писал:Вакшуль СергейЕсли массивы не нравятся, попробуйте коллекции:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub test()
Dim idsList As New Collection
    idsList.Add 1, "1"
    idsList.Add 11, "11"
    idsList.Add 111, "111"
    If idsList("11") = 111 Then
        Debug.Print "число 11 есть в списке"  'На текст сообщения не смотрите, это некорректное сообщение 
    Else
        Debug.Print "числа 11 нет в списке"   'На текст сообщения не смотрите, это некорректное сообщение 
    End If
End Sub



Обратите внимание, что ключ строковый. Имя ключа равно значению. Т.е. когда надо узнать, а есть ли в коллекции элемент, значение которого равно 11, то нужно просто обратится по имени ключа "11". С массивом так сделать нельзя. В этом весь фокус.
Тут смысл в том, что обращаясь таким образом к коллекции, вам не нужно лопатить в цикле по всем ее элементам, как в случае с функцией InArr. За вас это сделает Access. Он тоже будет лопатить (просто это от нас скрыто). Но он это делает быстрее, чем аналогичный код пользователя в стандартном модуле.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548223
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз повторюсь:Вакшуль СергейКоллекция быстрее. Но все, конечно, определяется контекстом.Например, если значения в списке значений на входе могут повторятся, то примененный подход с коллекциями, где значение элемента соответствует названию ключа, уже не применишь, т.к. имя ключа должно быть уникальным.
Да и наполнение коллекций, как совершенно справедливо заметил Андрей, требует времени. Если наполнение коллекции одно, а считываний много, то выигрыш есть. А если одно наполнение и одно считывание, то выигрыша не будет.
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548279
Еще вариант для Акса с непосредственным использованием IN:
If EVal(Число & " IN (" & СписокЗначений & ")") Then

Для вашего примера EVal(7 & " IN (3,18,15,389,45)") вернет 0 (False), а для 18 вернет -1 (True)

На скорость не проверял...
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548286
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
Да, Сергей, конечно же , вы правы.
А по поводу своего сообщения лишь могу привести анекдот :)

Мужик просыпается каждый раз утром с чувством, что во сне он сделал какое-то архиважное открытие. Но не помнит всякий раз какое. И он решает как-нибудь зафиксировать мысль, приходящую во сне. Заводит будильник на три часа ночи и кладет рядом на тумбочку лист бумаги с ручкой, просит жену растолкать его, когда зазвонит будильник. Ночью его, как просил, будит жена, он быстренько записывает что-то на листке бумаги и отрубается снова до утра. Утром просыпается, вспоминает, что ночью записал важную мысль. Радостный берет листок бумаги с тумбочки и читает - "Яичницу надо солить!!!"
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548970
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,

Хоть в VBA нет IN, зато есть "SELECT CASE" (как Вы и показали), а ещё EVAL (но это не функция VBA, а именно функция VBA для Access).

Что-то вроде этого
Код: vbnet
1.
? EVal("7 IN (3,18,15,389,45)")



Чем не вариант?
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39548981
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ),

Сорри, не увидел. Лень было до конца дочитать. :)
...
Рейтинг: 0 / 0
Есть ли число в списке чисел (то же что IN(...), только в коде)
    #39549079
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studierenНастаев,

Хоть в VBA нет IN, зато есть "SELECT CASE" (как Вы и показали), а ещё EVAL (но это не функция VBA, а именно функция VBA для Access).

Что-то вроде этого
Код: vbnet
1.
? EVal("7 IN (3,18,15,389,45)")



Чем не вариант?

Вариант что надо. Удобнее, чем Select case
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Есть ли число в списке чисел (то же что IN(...), только в коде)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]