이렇게하려면 기본 제공 방법이없고 IndexOf
에 대한 단일 호출을 사용하여이를 수행 할 방법이 없습니다.
먼저 발생하는 것을 찾으려면 각각의 값에 대해 하나씩 IndexOf
번을 세 번 호출해야하며 가장 낮은 인덱스를 갖는 것을 반환해야합니다. 항목 목록이 길을 확인하는 경우
program Project2;
{$APPTYPE CONSOLE}
uses
System.SysUtils, Classes;
function GetLowestIndexOf(const SL: TStrings; const AValues: array of string): Integer;
var
Idx, Temp: Integer;
begin
// Initialize with first test results (which may be -1)
Result := SL.IndexOf(AValues[0]);
for Idx := 1 to High(AValues) do
begin
Temp := SL.IndexOf(AValues[Idx]);
if (Temp > -1) and ((Temp < Result) or (Result = -1)) then
Result := Temp;
end;
end;
var
Test: Integer;
SL: TStringList;
begin
SL := TStringList.Create;
SL.Text := 'Some Value'#13'String C'#13'Another Value'#13'Something Else'#13 +
'String A'#13'Yet Another'#13'String B';
Test := GetLowestIndexOf(SL, ['String A', 'String B', 'String C']);
WriteLn(SL[Test]);
ReadLn;
end.
, 그것은 가치가있을 수도 있습니다 추가 테스트에 추가 : 이렇게하는 쉬운 래퍼 (콘솔 응용 프로그램과 함께 그것을 테스트하는) 이런 식으로 뭔가를 할 것입니다 만약 당신이 이미 가능한 한 가장 낮은 인덱스 (1과 가장 짧은 값의 길이 사이)를 찾았 으면 루프에서 빠져 나올 수 있습니다.
가장 작은 값이 -1이 아니면 안됩니다. –
@David : 이미 알아 챘습니다. –
* 물론 String의 첫 번째 항목을 찾고 다음 문자가 [A..C] 중 하나인지 테스트 할 수 있습니다. * 그럴 수는 없습니다. 첫 번째 문자는 String D이지만 대상 중 하나는 나중에 나타날 수 있습니다. –