Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];

Вниз

in кроме sets?   Найти похожие ветки 

 
АТ   (2003-10-02 16:48) [0]

Как можно реализовать максимально просто что-то типа
if "text" in ("asasd","asdasd","asd") ... ?
Т.е. использовать in но не только с ordinal type?


 
MBo   (2003-10-02 16:52) [1]

никак.
Поиск в сортированном списке строк или хэширование.


 
Anatoly Podgoretsky   (2003-10-02 17:01) [2]

MBo © (02.10.03 16:52) [1]
Сортировка не требуется, достаточно поиска в списке, массив частный случай.
Само слово IN конечно придется переименовать и превратить в функцию.


 
MBo   (2003-10-02 17:05) [3]

>Anatoly Podgoretsky
я указал про сортированный из-за скорости поиска (если большой список, конечно)


 
Anatoly Podgoretsky   (2003-10-02 17:37) [4]

Да это понятно, тебе и мне, а вот насчет него не уверен


 
АТ   (2003-10-02 17:48) [5]

Да нет, почему, все понятно. Просто мне давно было интересно можно ли именно стандартными средствами, без написания своих функций сделать поиск в массиве string.
Вообщем-то приходится пользоватся этим часто, а писать постоянно циклы или добавлять лишние компоненты не очень хочеться ...


 
MBo   (2003-10-02 17:53) [6]

стандартными средствами - TStringList.IndexOf


 
Карелин Артем   (2003-10-02 17:58) [7]

Ну еще можно типа if (pos(""text"",""asasd""asdasd""asd"")<>0) then


 
АТ   (2003-10-02 19:21) [8]

Вот! То что нужно.
А ведь можно было и догадаться, - так нет, все тянет к стандартным процедурам и .т.д. и т.п. Спасибо большое!


 
Тих   (2003-10-02 21:16) [9]

моя любимая.

function IsIn(const Value: string; const ASet: array of const): boolean;
var i: integer;
begin
Result := false;
for i:=0 to High(ASet) do
if string(ASet[i].VAnsiString) = Value then Result := true;
end;

if IsIn("aa", ["aaa", "bbb", "ccc", "dddd"]) then writeln("true");


 
Anatoly Podgoretsky   (2003-10-02 21:24) [10]

Тих (02.10.03 21:16) [9]
А давай посмотрим сколько времени она будет работать на миллоне строк и сравним потом с TStringList.IndexOf
Надеюсь, что у тебя нервы крепкие в обморок не упадешь


 
Тих   (2003-10-02 21:32) [11]

У меня будет работать в среднем половину времени от полной итерации по массиву. А давайте подумаем, имеет ли смысл рожать TStringList для условия, предложенного автором вопроса - выбор из трех-четырех-десяти значений. Вариант с миллионом строк, возможно, для СУБД и уместен, но там и TStringList подавится.


 
Palladin   (2003-10-02 21:38) [12]


> Тих (02.10.03 21:32) [11]

ничем он не давится... прекрасно отрабатывает...


 
Тих   (2003-10-02 21:42) [13]

Вот давайте пофлеймим на тему, почему Oracle написан не на Delphi и зачем придумана STL.

http://www.rsdn.ru/article/devtools/perftest.xml


 
Anatoly Podgoretsky   (2003-10-02 21:58) [14]

Тих (02.10.03 21:32) [11]
Чего, половину, срочно марш в Потрепаться


 
Palladin   (2003-10-02 22:12) [15]

TStringList при поиске значения в отсортированном списке размером в один миллион сделает около 30 итераций...


 
Palladin   (2003-10-02 22:13) [16]

думаю немножко не сравнимо с твоей функцией...


 
Тих   (2003-10-02 22:13) [17]

Anatoly Podgoretsky © (02.10.03 21:58) [14]

Ладно вам, накинулись )

function IsIn(const Value: string; const ASet: array of const): boolean;
var i: integer;
begin
Result := false;
for i:=0 to High(ASet) do
if string(ASet[i].VAnsiString) = Value then
begin
Result := true;
Exit;
end;
end;

Вот теперь половину.


 
Anatoly Podgoretsky   (2003-10-02 22:20) [18]

Тих (02.10.03 22:13) [17]
Не накинулся, но не надо утверждать, то чего нет в функции.
Вот теперь нет возражений.
И последняя оптимизация Result := false, надо поставить перед последним end



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
3-40293
RDen
2003-09-22 13:58
2003.10.13
ADO


3-40317
Flash
2003-09-22 09:51
2003.10.13
Проблема с доступом к БД из разных потоков


6-40566
WASYA
2003-08-18 13:11
2003.10.13
Трафик


3-40319
Alexia2
2003-09-24 09:50
2003.10.13
Что за зверь эта транзакция?


3-40291
Buka
2003-09-21 10:25
2003.10.13
Приведение в работоспособность библиотечного компонента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский