Мне нужно знать, все ли символы в строке равны (образованы одним и тем же символом). функция должна возвращать истину или ложь в зависимости от того, равны ли все элементы строки определенному символу.
Я написал эту функцию, которая работает хорошо, но я '
наконец, используя предложение Барри Келли и добавив директиву inline
, производительность была значительно улучшена.
function AllElementsAreEqual(Const Element:Char;Str:String):Boolean;inline;
type
ArrayInt = Array of Integer;
var
i : Integer;
Delta: Integer;
List : ArrayInt;
Test : Integer;
begin
Result:=True;
Delta:=(Length(Str) mod 4);
if Delta<>0 then
Str:=Str+StringOfChar(Element,4-Delta);
Test:=Ord(Element) + Ord(Element) shl 8 + Ord(Element) shl 16 + Ord(Element) shl 24;
List:=ArrayInt(@(Str[1]));
for i:=0 to ((Length(Str) div 4)-1) do
if List[i]<>Test then
begin
Result:=False;
exit;
end;
end;
ОБНОВЛЕНИЕ 2
Извините, но я опубликовал старую реализацию решения (с ошибкой) , сейчас исправлено. Благодарим The_Fox за создание лучшей реализации предложения Барри.