CASE со строками

-===DiMas===-

Чем можно заменить CASE (кроме IF...ELSE) для выбора действия в зависимости от различных значений для строковой переменной?
21 ответ

-===DiMas===-

Ну например двоичным поиском в массиве именованных функторов


-===DiMas===-


-===DiMas===-

вот так, например:
<b>type</b>
 TProcedure = <b>procedure</b>;

 TItem=<b>class</b>
 <b>private</b>
 FProc:TProcedure;
 FName:<b>string</b>;
 <b>public</b>
 <b>property</b> Proc:TProcedure read FProc;
 <b>property</b> Name:<b>string</b> read FName;
 <b>constructor</b> Create(<b>const</b> aProc:TProcedure; <b>const</b> aName:<b>string</b>);
 <b>end</b>;

<b>constructor</b> TItem.Create(<b>const</b> aProc: TProcedure; <b>const</b> aName: <b>string</b>);
<b>begin</b>
 <b>inherited</b> Create();
 FProc:=aProc;
 FName:=aName;
<b>end</b>;

<b>procedure</b> P();
<b>begin</b>
 ShowMessage('P');
<b>end</b>;

<b>procedure</b> Q();
<b>begin</b>
 ShowMessage('Q');
<b>end</b>;

<b>procedure</b> Test(aList:TObjectList; <b>const</b> S:<b>string</b>);
<b>var</b>
 i:Integer;
<b>begin</b>
 <b>for</b> i:=<b>0</b> <b>to</b> aList.Count-<b>1</b> <b>do</b>
 <b>if</b> TItem(aList[i]).Name=S <b>then</b>
 <b>begin</b>
 TItem(aList[i]).Proc();
 <b>end</b>;
<b>end</b>;

<b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>var</b>
 List:TObjectList;
<b>begin</b>
 List:=TObjectList.Create();
 List.Add(TItem.Create(P,'P'));
 List.Add(TItem.Create(Q,'Q'));
 Test(List,'P');
 List.Free();
<b>end</b>;
С уважением, Naf


-===DiMas===-

Чем можно заменить CASE (кроме IF...ELSE) для выбора действия в зависимости от различных значений для строковой переменной?
Запихнуть различные значения в StringList. Потом case StringList.IndexOf(строковая переменная).


-===DiMas===-

Извращённый метод:Обьявить тип
<b>type</b>
 TMyType = (строка1, строка2, ..., строкаN);

...

<b>function</b> TExecuteMenuItem.SetEventMenuClick(AStr: <b>string</b>): TNotifyEvent;
<b>begin</b>
 <b>case</b> TMyType(GetEnumValue(TypeInfo(TMyType), AStr)) <b>of</b>
 строка1: result := ...;
 строка2: result := ...;
 ...
 строкаN: result := ...;
 <b>end</b>;


-===DiMas===-

вот так, например:
Я не ожидал, что кто-то серьёзно воспримет мои слова


-===DiMas===-

Степень извращений, только лишь бы не использовать IF, не имеет пределов.--http://www.podgoretsky.com


-===DiMas===-

Степень извращений, только лишь бы не использовать IF, не имеет пределов.--http://www.podgoretsky.com
Просто иногда хочется сделать более удобно читаемый код.При обработке различных состояний case мне кажется более удобным чем кучка if ... thenНо это все ИМХО и по большей части лирика


-===DiMas===-

case частный случай IF, оптимизированый для ординальных типов.--http://www.podgoretsky.com


-===DiMas===-

Просто иногда хочется сделать более удобно читаемый код.При обработке различных состояний case мне кажется более удобным чем кучка if ... then
Хорошо отформатированный if никак не менее читаем, чем case. Собственно говоря, начиная с определённого момента сложности, case становится нужным форматировать "под if" именно для обеспечения читабельности.


-===DiMas===-

Собственно, да - когда в "узлах" CASE-а появляются begin-end-ы - If читается нагляднее.


-===DiMas===-

Извращённый метод:
Метод с TheDayliWTF:
case hash(string) of
 <b>1531</b>: ...
 <b>8680</b>: ...
end;


-===DiMas===-

Dimitry Sibiryakov, я бы бил через SounExRu


-===DiMas===-

Dimitry Sibiryakov> ...Ради чего? Производительности? Наглядности кода?
<b>case</b> hash(<b>string</b>) <b>of</b>
 hash('123'): ...
 hash('abc'): ...
<b>end</b>;


-===DiMas===-

Gator> case hash(string) of> hash('123'): ...> hash('abc'): ...> end;Такое не скомпилится.


-===DiMas===-

Гаджимурадов Рустам, Да? Ну вам виднее... Никогда этой хренью не морочился.А в VBA это просто синтаксис?
Select Case str
 Case "aaa": s = "aaa"
 Case "123": s = "123"
 Case Else: s = "???"
End Select
Через "внутренние хэши"...


-===DiMas===-

Нет, в VBA (и вообще, в бэйсике) строки"особенные". Впрочем, не только строки.


-===DiMas===-

Грубо говоря, кто мешает (кроме Вирта) эту "особенность" реализовать в ... IDE/мастере/экспертеТолько зачем?


-===DiMas===-

Gator> Грубо говоря, кто мешает (кроме Вирта) этуGator> "особенность" реализовать в ... IDE/мастере/экспертеКомпилятор.


-===DiMas===-

Грубо говоря, кто мешает (кроме Вирта) эту "особенность" реализовать в ... IDE/мастере/экспертеТолько зачем?
Таки реализовали ведь


-===DiMas===-

Грубо говоря, кто мешает (кроме Вирта) эту "особенность" реализовать в ... IDE/мастере/экспертеТолько зачем?
В Оракле пользуюсь и даже не думаю - зачем? Просто пользуюсь.