У меня есть статус, который хранится как строка заданной длины, либо в файле, либо в базе данных.Перечисление строки
Я ищу перечислить возможный статус
У меня есть следующий тип, чтобы определить возможный статус
Type TStatus = (fsNormal = Ord('N'),fsEditedOnScreen = Ord('O'),
fsMissing = Ord('M'),fsEstimated = Ord('E'),fsSuspect = Ord('s'),
fsSuspectFromOnScreen = Ord('o'),fsSuspectMissing = Ord('m'),
fsSuspectEstimated = Ord('e'));
Во-первых, это действительно хорошая идея? или должен ли я иметь отдельный массив const, хранящий преобразования символов? Это означало бы более одного места для обновления.
Теперь преобразование строки в массив состояния У меня есть следующее, но как я могу проверить, является ли символ действительным, не перебирая нумерацию?
Function StrToStatus(Value : String):TStatusArray;
var
i: Integer;
begin
if Trim(Value) = '' then
begin
SetLength(Result,0);
Exit;
end;
SetLength(Result,Length(Value));
for i := 1 to Length(Value) do
begin
Result[i] := TStatus(Value[i]); // I don't think this line is safe.
end;
end;
После некоторого испытания он SAMES подозреваемый линия безопасна (не врезаться!), А просто добавляет (вне границ) значений, которые затем нужно отфильтровать.
Function StrToStatus(Value : String):TStatusArray;
var
i: Integer;
begin
if Trim(Value) = '' then
begin
SetLength(Result,0);
Exit;
end;
SetLength(Result,Length(Value));
for i := 1 to Length(Value) do
begin
Result[i-1] := TStatus(Value[i]);
end;
for i := 0 to Length(Result) - 1 do
begin
case Result[i] of
fsNormal: ;
fsEditedOnScreen: ;
fsMissing: ;
fsEstimated: ;
fsSuspect: ;
fsSuspectFromOnScreen: ;
fsSuspectMissing: ;
fsSuspectEstimated: ;
else
Result [i] := fsNormal;
end;
end;
end;
Это позволяет все состояние и их относительных значения Char, чтобы быть в одном месте и предотвращает перекручивание через каждый статус для каждого символа в строке. (Так что в моей голове по крайней мере должно быть немного быстрее)
AFAIK это должно быть хорошо для преобразования обратно.
Function StatusToStr(Value : TStatusArray):String;
var
i: Integer;
begin
for i := 0 to Length(Value) - 1 do
Result := Result + Chr(Ord(Value[i]))
end;
Я использую Delphi 2007
Мне нужен результат, чтобы быть массивом вместо set (строка представляет собой различный статус нескольких значений, каждое значение может иметь только один статус).Кроме того, я должен иметь проблемы с производительностью с дополнительным циклом? –
Дополнительный цикл, который вы имеете в виду в CharToStatus? Вы можете заменить его, построив массив массивов 'array [Char] из TStatus', прежде чем использовать StrToStatus в первый раз. Я понятия не имею, ускорит ли это процесс. –